Load data

Internal

CN

Read raw

Templates

Merge raw w/ template

14C

Mass


Call:
lm(formula = loss_pct ~ PM + ECO, data = sra.frc.mss.lss.df[-which(sra.frc.mss.lss.df$Probe == 
    "BSpp_comp_2001_18-28"), ])

Residuals:
    Min      1Q  Median      3Q     Max 
-4.1953 -0.9261 -0.4445  0.7965  5.7767 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   4.8136     0.5726   8.406 1.06e-10 ***
PMBS         -0.1405     0.6486  -0.217 0.829539    
PMGR         -2.3959     0.6382  -3.754 0.000507 ***
ECOwf        -1.0117     0.6382  -1.585 0.120098    
ECOrf        -1.7850     0.6394  -2.792 0.007729 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.831 on 44 degrees of freedom
Multiple R-squared:  0.3641,    Adjusted R-squared:  0.3063 
F-statistic: 6.299 on 4 and 44 DF,  p-value: 0.0004255

Interestingly, it appears that AN soils have proportionally LESS minC by mass than do GR or BS soils, significantly so at depth. Why would this be? Possibly because AN soils have higher losses (DOC) during fractionation?

External data

Atmosphere

from C. Rasmussen (’01 C, N; ’09 14C, frc mass, C, N)

calculating Δ14C from fraction modern

Analysis

Misc. functions

Bulk C

2001

2009

2019

Fraction C

C, CN profiles

[[1]]

[[2]]

[[3]]

[[1]]

[[2]]

[[3]]

[[1]]

[[2]]

[[3]]

[[1]]

[[2]]

[[3]]

C distribution

`summarise()` has grouped output by 'PMeco'. You can override using the `.groups` argument.

Fraction 14C

Depth profiles

Spline ’01, ’09

Spline C

[[1]]

[[2]]

[[3]]

Spline 14C

C-weighted 14C spline

14C time series

$`10`

$`20`

$`30`

$`10`

$`20`

$`30`

Char pool calc

Free light vs respired 14C

Thermal fractions

C release (thermograms)

Thermal fraction 14C

LS0tCnRpdGxlOiAiU2llcnJhIE5ldmFkYSBGcmFjdGlvbiBBbmFseXNpcyIKYXV0aG9yOiBKLiBCZWVtLU1pbGxlcgpkYXRlOiBcdGV4dGl0e1x0b2RheX0Kb3V0cHV0OgogIHBkZl9kb2N1bWVudDoKICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleAogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogMwogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6ICcyJwogIGh0bWxfbm90ZWJvb2s6CiAgICBjc3M6ICJjdXN0b20uY3NzIgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogMgpoZWFkZXJfaW5jbHVkZXM6Ci0gXHVzZXBhY2thZ2VbdXRmOF17aW5wdXRlbmN9Ci0gXHVzZXBhY2thZ2V7ZmxvYXR9Ci0tLQoKYGBge3IgZ2xvYmFsX29wdGlvbnMsIGluY2x1ZGUgPSBGQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBmaWcuYWxpZ24gPSAnY2VudGVyJywgZGV2ID0gYygnY2Fpcm9fcGRmJywgJ3BuZycpLCBmaWcud2lkdGggPSA2LjUsCiAgICAgICAgICAgICAgICAgICAgICBmaWcuaGVpZ2h0ID0gMy41KQpvcHRpb25zKHNjaXBlbiA9IDUpCiMgbG9hZCBwYWdlIGJyZWFrcyBmeApzb3VyY2UoIi4vdXRpbGl0aWVzL3BhZ2VfYnJlYWtfUm1kLlIiKQpgYGAKCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShTb2lsUikKbGlicmFyeShvcGVueGxzeCkKbGlicmFyeShJU1JhRCkKbGlicmFyeShsbWU0KQpsaWJyYXJ5KGxtZXJUZXN0KQpsaWJyYXJ5KGVtbWVhbnMpCmxpYnJhcnkoZ3QpCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KEdTSUYpCmxpYnJhcnkoYXFwKQpgYGAKCmBgYHtyIGxvYWQgcmF3LWRhdGEtaW5nZXN0IGZ4fQpzb3VyY2UoIi4vdXRpbGl0aWVzL2plbmFfYW1zX2luZ2VzdC5SIikKc291cmNlKCIuL3V0aWxpdGllcy9qZW5hX2lzb19pbmdlc3QuUiIpCnNvdXJjZSgiLi91dGlsaXRpZXMvamVuYV9lbG1faW5nZXN0LlIiKQpgYGAKCmBgYHtyIHBsb3QtZnVuc30KIyBjb2xvciBwYWxldHRlcyBmb3IgRUNPICYgUE0Kd2FybSA8LSAiI0JGODEyRCIKY29vbCA8LSAiIzgwQ0RDMSIKY29sZCA8LSAiIzAxNjY1RSIKZ3Jhbml0ZSA8LSAiIzlkYWJhOSIKYW5kZXNpdGUgPC0gIiMzODJkYmYiCmJhc2FsdCA8LSAiI2JmMzgyZCIKbWluQyA8LSAiIzliMDAzZiIKZlBPTSA8LSAiIzNmOWIwMCIKb1BPTSA8LSAiIzAwNDdhZiIKYGBgCgojIExvYWQgZGF0YQojIyBJbnRlcm5hbCAKIyMjIENOCiMjIyMgUmVhZCByYXcKCmBgYHtyIGxvYWQtY24tZGF0fQojIDIwMDEgJiAyMDE5IGRlbnNpdHkgZnJhY3Rpb24gZGF0YQplbG1fcmVzdWx0c19kaXIgPC0gbGlzdC5maWxlcygiLi4vZGF0YS9yYXciLCBwYXR0ZXJuID0gImVsbV9qZW5hX3Jlc3VsdHMiLCBmdWxsLm5hbWVzID0gVFJVRSkKZWxtX3Jlc3VsdHNfbHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhlbG1fcmVzdWx0c19kaXIpLCBmdW5jdGlvbihpKSB7CiAgaWYgKGdyZXBsKCJlbG1famVuYV9yZXN1bHRzLXNvaWwiLCBlbG1fcmVzdWx0c19kaXJbaV0pKSB7CiAgICB0ZW1wbGF0ZV9maWxlIDwtICIuLi9kYXRhL3Jhdy9lbG1famVuYV90ZW1wbGF0ZS9lbG1famVuYV90ZW1wbGF0ZTIueGxzIgogIH0gZWxzZSB7CiAgICB0ZW1wbGF0ZV9maWxlIDwtICIuLi9kYXRhL3Jhdy9lbG1famVuYV90ZW1wbGF0ZS9lbG1famVuYV90ZW1wbGF0ZS54bHMiCiAgfQogIHJlYWRfamVuYV9lbG1fcmVzdWx0cyhlbG1fcmVzdWx0c19kaXJbaV0sIHRlbXBsYXRlX2ZpbGUgPSB0ZW1wbGF0ZV9maWxlKQp9KQpuYW1lcyhlbG1fcmVzdWx0c19scykgPC0gbGlzdC5maWxlcygiLi4vZGF0YS9yYXciLCBwYXR0ZXJuID0gImVsbV9qZW5hX3Jlc3VsdHMiKQoKIyBzZXBhcmF0ZSBidWxrQyBmcm9tIGZyY0MKZWxtX3Jlc3VsdHNfYmxrQ19scyA8LSBlbG1fcmVzdWx0c19sc1t3aGljaChncmVwbCgiZWxtX2plbmFfcmVzdWx0cy1zb2lsIiwgbmFtZXMoZWxtX3Jlc3VsdHNfbHMpKSldCmVsbV9yZXN1bHRzX2ZyY0NfbHMgPC0gZWxtX3Jlc3VsdHNfbHNbd2hpY2goZ3JlcGwoImVsbV9qZW5hX3Jlc3VsdHMtZnJjIiwgbmFtZXMoZWxtX3Jlc3VsdHNfbHMpKSldCgojIGV4dHJhY3QgYnVsayBDIGFuZCBzdW1tYXJpemUKc3JhLmJsay4yMDE5LmRmIDwtIGJpbmRfcm93cyh1bmxpc3QoZWxtX3Jlc3VsdHNfYmxrQ19scywgcmVjdXJzaXZlID0gRkFMU0UpKSAlPiUKICBtdXRhdGUoUE1lY28gPSBzYXBwbHkoc3Ryc3BsaXQoSUQsICJfIiksICJbIiwgMiksCiAgICAgICAgIGRlcHRoID0gc2FwcGx5KHN0cnNwbGl0KElELCAiXyIpLCAiWyIsIDQpKQpzcmEuYmxrLjIwMTkuc3VtLmRmIDwtIHNyYS5ibGsuMjAxOS5kZiAlPiUKICBncm91cF9ieShQTWVjbywgZGVwdGgpICU+JQogIHN1bW1hcml6ZShhY3Jvc3MoYyhDLCBOKSwgLmZucyA9IGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lCiAgbXV0YXRlKElEMiA9IHBhc3RlKFBNZWNvLCBkZXB0aCwgc2VwID0gIl8iKSkKYGBgCgojIyMjIFRlbXBsYXRlcwoKYGBge3IgY3JlYXRlLWZyYy1kYXRhLXRlbXBsYXRlc30KIyMgQ3JlYXRlIHRlbXBsYXRlIGZvciBjb21wb3NpdGUgc29pbCBkYXRhIChlLmcuIGRlbnNpdHkgZnJhY3Rpb25zKQojIEJhc2ljIGxpc3QgdGVtcGxhdGUKUE1lY28ubHMgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IDkpCm5hbWVzKFBNZWNvLmxzKSA8LSBsZXZlbHMoaW50ZXJhY3Rpb24oYygiQU4iLCAiQlMiLCAiR1IiKSwgYygicHAiLCAid2YiLCAicmYiKSwgc2VwID0gIiIpKQoKIyBsaXN0IG9mIGRlcHRocyBmb3IgMjAwMSBzYW1wbGVzCmRlcHRoX2JvdF8yMDAxLmxzIDwtIGxpc3QoQU5wcCA9IGMoNiwgMTMsIDMzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBBTndmID0gYygxMSwgMzUpLAogICAgICAgICAgICAgICAgICAgICAgICAgIEFOcmYgPSBjKDExLCAzMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgQlNwcCA9IGMoNywgMTgsIDI4KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBCU3dmID0gYygxMCwgMTkpLAogICAgICAgICAgICAgICAgICAgICAgICAgIEJTcmYgPSBjKDgsIDE1LCAzMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgR1JwcCA9IGMoNywgMTUsIDI3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBHUndmID0gYyg0LCAxMywgMjgpLAogICAgICAgICAgICAgICAgICAgICAgICAgIEdScmYgPSBjKDgsIDI3KSkKCiMgbGlzdCBvZiBkZXB0aHMgZm9yIDIwMTkgc2FtcGxlcwpkZXB0aF9ib3RfMjAxOS5scyA8LSBsYXBwbHkoUE1lY28ubHMsIGZ1bmN0aW9uKGRmKSBzZXEoMTAsIDMwLCAxMCkpCgojIHRlbXBsYXRlIGZ4CnNyYS5mcmMudGVtcGxhdGUuZnggPC0gZnVuY3Rpb24oZGVwdGhfYm90LCB5ZWFyKSB7CiAgbm1zIDwtIG5hbWVzKGRlcHRoX2JvdCkKICBscyA8LSBsYXBwbHkoc2VxX2Fsb25nKGRlcHRoX2JvdCksIGZ1bmN0aW9uKGkpIHsKICAgIG4gPC0gbGVuZ3RoKGRlcHRoX2JvdFtbaV1dKQogICAgZGYgPC0gZGF0YS5mcmFtZSh5ZWFyID0gcmVwKHllYXIsIG4pLAogICAgICAgICAgICAgICAgICAgICBQTSA9IHJlcChzdWJzdHIobm1zW2ldLCAxLCAyKSwgbiksIAogICAgICAgICAgICAgICAgICAgICBFQ08gPSByZXAoc3Vic3RyKG5tc1tpXSwgMywgNCksIG4pLAogICAgICAgICAgICAgICAgICAgICBseXJfYm90ID0gZGVwdGhfYm90W1tpXV0pCiAgICBkZiRseXJfdG9wIDwtIHNhcHBseShzZXFfYWxvbmcoZGVwdGhfYm90W1tpXV0pLCBmdW5jdGlvbihqKSB7CiAgICAgIGlmIChqID09IDEpIHsKICAgICAgICAwCiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVwdGhfYm90W1tpXV1baiAtIDFdCiAgICAgIH0KICAgIH0pCiAgICBkZiRJRCA8LSBwYXN0ZTAoZGYkUE0sIGRmJEVDTywgIl9jb21wXyIsIGRmJHllYXIsICJfIiwgZGYkbHlyX3RvcCwgIi0iLCBkZiRseXJfYm90KQogICAgcmV0dXJuKGRmKQogIH0pCiAgbmFtZXMobHMpIDwtIG5tcwogIGZyYy5scyA8LSByZXBsaWNhdGUoMywgbHMsIEZBTFNFKQogIG5hbWVzKGZyYy5scykgPC0gYygiRlBPTSIsICJPUE9NIiwgIk1PTSIpCiAgcmV0dXJuKGZyYy5scykKfQoKIyAyMDAxCnNyYS5mcmMudG1wLjIwMDEubHMgPC0gc3JhLmZyYy50ZW1wbGF0ZS5meChkZXB0aF9ib3RfMjAwMS5scywgMjAwMSkKCiMgMjAxOQpzcmEuZnJjLnRtcC4yMDE5LmxzIDwtIHNyYS5mcmMudGVtcGxhdGUuZngoZGVwdGhfYm90XzIwMTkubHMsIDIwMTkpCmBgYAoKIyMjIyBNZXJnZSByYXcgdy8gdGVtcGxhdGUKCmBgYHtyIGZpbGwtZnJjLWNufQojIGRlZmluZSBleHRyYWN0aW9uIGZ1bmN0aW9uCmZpbGwuY24uZnggPC0gZnVuY3Rpb24odGVtcGxhdGUsIGVsbV9yZXN1bHRzX2xzLCB5ZWFyLCB0eXBlKSB7CiAgCiAgIyBpbnRlcm5hbCBmeCBmb3IgZXh0cmFjdGluZyBjbiBkYXRhIGFuZCBhdmVyYWdpbmcgYW5hbHl0aWNhbCBkdXBsaWNhdGVzIGFzIG5lZWRlZAogIGV4dHJhY3QuZWxtLmZ4IDwtIGZ1bmN0aW9uKGxzKSB7CiAgICBsYXBwbHkobHMsIGZ1bmN0aW9uKHgpIHsKICAgICAgaXggPC0gZ3JlcCh4JElELCBjbi5kZiRJRCkKICAgICAgaWYgKGxlbmd0aChpeCA+IDEpKSB7CiAgICAgICAgeCA8LSBjYmluZCh4LAogICAgICAgICAgICAgICAgICAgQyA9IG1lYW4oY24uZGZbaXgsICJDIl0pLCAKICAgICAgICAgICAgICAgICAgIE4gPSBtZWFuKGNuLmRmW2l4LCAiTiJdKSwgCiAgICAgICAgICAgICAgICAgICByb3cubmFtZXMgPSBOVUxMKQogICAgICB9IGVsc2UgaWYgKGxlbmd0aChpeCkgPT0gMSkgewogICAgICAgIHggPC0gY2JpbmQoeCwgY24uZGZbaXgsIGMoIkMiLCAiTiIpXSwgcm93Lm5hbWVzID0gTlVMTCkKICAgICAgfQogICAgICByZXR1cm4oeCkKICAgIH0pICAgIAogIH0KICAKICAjIHNlbGVjdCBDTiBkYXRhIGJ5IHllYXIKICBjbi5scyA8LSB1bmxpc3QoCiAgICBsYXBwbHkoZ3JlcChwYXN0ZTAodHlwZSwgc3Vic3RyKHllYXIsIDMsIDQpKSwgbmFtZXMoZWxtX3Jlc3VsdHNfbHMpKSwgZnVuY3Rpb24oaSkgewogICAgICBlbG1fcmVzdWx0c19sc1tbaV1dCiAgICB9KSwgcmVjdXJzaXZlID0gRkFMU0UpCiAgCiAgIyBzdG9yZSBmcmFjdGlvbiBuYW1lcwogIG5tcyA8LSBuYW1lcyh0ZW1wbGF0ZSkKICAKICAjIGxvb3AgZm9yIHJ1bm5pbmcgZXh0cmFjdGlvbgogIGZvcihpIGluIHNlcV9hbG9uZyhubXMpKSB7CiAgICAKICAgICMgbWFrZSBkYXRhIGZyYW1lIG9mIGRhdGEgZm9yIHRhcmdldCBmcmFjdGlvbiBhbmQgeWVhcgogICAgY24uZGYgPC0gYmluZF9yb3dzKGNuLmxzW2dyZXAobmFtZXModGVtcGxhdGUpW2ldLCBuYW1lcyhjbi5scykpXSkKICAgIAogICAgIyBjaGVjayBpZiB0YXJnZXQgZnJhY3Rpb24gZGF0YSBleGlzdCBhbmQgcnVuIGV4dHJhY3Rpb24gZnVuY3Rpb24gaWYgc28KICAgIGlmIChucm93KGNuLmRmKSAhPSAwKSB7CiAgICAgIAogICAgICAjIGV4dHJhY3QgZGF0YSBmb3IgZWFjaCBmcmFjdGlvbgogICAgICB0ZW1wbGF0ZVtbaV1dIDwtIGxhcHBseSh0ZW1wbGF0ZVtbaV1dLCBmdW5jdGlvbihkZikgewogICAgICAgIGJpbmRfcm93cyhleHRyYWN0LmVsbS5meChzcGxpdChkZiwgZGYkSUQpKSkKICAgICAgfSkKICAgIH0KICB9CiAgCiAgIyByZXR1cm4gb3V0cHV0IGxpc3QgbmFtZWQgYnkgdGFyZ2V0IGZyYWN0aW9uCiAgbmFtZXModGVtcGxhdGUpIDwtIG5tcwogIHJldHVybih0ZW1wbGF0ZSkgCn0KCiMgZXh0cmFjdCBsYXllciBkYXRhIGJ5IHllYXIKc3JhLmZyYy4yMDAxLmxzIDwtIGZpbGwuY24uZngoc3JhLmZyYy50bXAuMjAwMS5scywgZWxtX3Jlc3VsdHNfZnJjQ19scywgMjAwMSwgImZyYyIpCnNyYS5mcmMuMjAxOS5scyA8LSBmaWxsLmNuLmZ4KHNyYS5mcmMudG1wLjIwMTkubHMsIGVsbV9yZXN1bHRzX2ZyY0NfbHMsIDIwMTksICJmcmMiKQpgYGAKCiMjIyAxNEMKCmBgYHtyIGxvYWQtMTRjLWRhdH0KIyByZWFkIGFtcyBkaXIKYW1zX2plbmFfcmVzdWx0c19kaXJzIDwtIGxpc3QuZmlsZXMoIi4uL2RhdGEvcmF3IiwgcGF0dGVybiA9ICJhbXNfamVuYV9yZXN1bHRzIiwgZnVsbC5uYW1lcyA9IFRSVUUpCgojIGxpc3QgZmlsZXMgdy8gbmV3IGFuZCBvbGQgdGVtcGxhdGVzIGJ5IGRhdGUKZGF0ZXMgPC0gc2FwcGx5KGxhcHBseShzdHJzcGxpdChhbXNfamVuYV9yZXN1bHRzX2RpcnMsICJfKD8hLipfKSIsIHBlcmwgPSBUUlVFKSwgIltbIiwgMiksIGFzLkRhdGUpCmFtc19qZW5hX3Jlc3VsdHNfZGlyc19uZXcgPC0gYW1zX2plbmFfcmVzdWx0c19kaXJzW3doaWNoKGRhdGVzID4gYXMuRGF0ZSgiMjAyMi0wMS0yMyIpKV0KYW1zX2plbmFfcmVzdWx0c19kaXJzX29sZCA8LSBhbXNfamVuYV9yZXN1bHRzX2RpcnNbd2hpY2goZGF0ZXMgPCBhcy5EYXRlKCIyMDIyLTAxLTIzIikpXQoKIyBuZXcgdGVtcGxhdGUKbmV3X3RlbXBsYXRlIDwtICIuLi9kYXRhL3Jhdy9hbXNfamVuYV90ZW1wbGF0ZV8yMDIyLTAxLTI0L2Ftc19qZW5hX3RlbXBsYXRlLnhsc3giCgojIHJlYWQgaW4gZGF0YQphbXNfcmVzdWx0c19scyA8LSBjKAogIGxhcHBseShzZXFfYWxvbmcoYW1zX2plbmFfcmVzdWx0c19kaXJzX25ldyksIGZ1bmN0aW9uKGkpIHsKICAgIHJlYWRfamVuYV9hbXNfcmVzdWx0cyhhbXNfamVuYV9yZXN1bHRzX2RpcnNfbmV3W2ldLCAKICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9maWxlID0gbmV3X3RlbXBsYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gMzEpCiAgfSksCiAgbGFwcGx5KHNlcV9hbG9uZyhhbXNfamVuYV9yZXN1bHRzX2RpcnNfb2xkKSwgZnVuY3Rpb24oaSkgewogICAgcmVhZF9qZW5hX2Ftc19yZXN1bHRzKGFtc19qZW5hX3Jlc3VsdHNfZGlyc19vbGRbaV0pCiAgfSkpCm5hbWVzKGFtc19yZXN1bHRzX2xzKSA8LSB1bmxpc3QoCiAgYyhsYXBwbHkoc3Ryc3BsaXQoYW1zX2plbmFfcmVzdWx0c19kaXJzX25ldywgIi8oPyEuKi8pIiwgcGVybCA9IFRSVUUpLCAiW1siLCAyKSwKICAgIGxhcHBseShzdHJzcGxpdChhbXNfamVuYV9yZXN1bHRzX2RpcnNfb2xkLCAiLyg/IS4qLykiLCBwZXJsID0gVFJVRSksICJbWyIsIDIpKSkKCiMgcmVtb3ZlIGZsYXdlZCBBTnJmIHNhbXBsZXMKQU5yZi5ybSA8LSBjKCIxMF9BTnJmX2NvbXBfMjAxOV8wLTEwX01PTSIsIAogICAgICAgICAgICAgIjExX0FOcmZfY29tcF8yMDE5XzEwLTIwX01PTV9hIiwKICAgICAgICAgICAgICIxMl9BTnJmX2NvbXBfMjAxOV8yMC0zMF9NT00iKQppZiAoYW55KCFpcy5uYShtYXRjaChBTnJmLnJtLCBhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1mcmMxOS1NT01fMjAyMS0wNi0yNmAkYEJlZW0tTWlsbGVyXzI0Lnhsc3hgJFByb2JlKSkpKSB7CiAgYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtZnJjMTktTU9NXzIwMjEtMDYtMjZgJGBCZWVtLU1pbGxlcl8yNC54bHN4YCA8LSBhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1mcmMxOS1NT01fMjAyMS0wNi0yNmAkYEJlZW0tTWlsbGVyXzI0Lnhsc3hgWy1tYXRjaChBTnJmLnJtLCBhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1mcmMxOS1NT01fMjAyMS0wNi0yNmAkYEJlZW0tTWlsbGVyXzI0Lnhsc3hgJFByb2JlKSwgXQp9CgojICMgc2VwYXJhdGUgcmVkb3MKIyBhbXNfcmVzdWx0c19yZWRvX2xzIDwtIGxhcHBseShhbXNfcmVzdWx0c19scywgZnVuY3Rpb24obHMpCiMgICAgIEZpbHRlcihOZWdhdGUoaXMubnVsbCksIGxhcHBseShscywgZnVuY3Rpb24oZGYpIHsKIyAgICAgICBkZl9SIDwtIGRmW2dyZXAoIl9SIiwgZGYkUHJvYmUpLCBdIAojICAgICAgIGlmIChucm93KGRmX1IpICE9IDApIHsKIyAgICAgICAgIGRmX1IKIyAgICAgICB9CiMgICAgIH0pKSkKIyBhbXNfcmVzdWx0c19yZWRvX2RmIDwtIGJpbmRfcm93cyhGaWx0ZXIoCiMgICAgIE5lZ2F0ZShpcy5udWxsKSwgbGFwcGx5KGFtc19yZXN1bHRzX3JlZG9fbHMsIGZ1bmN0aW9uKGxzKSB7CiMgICAgICAgaWYgKGxlbmd0aChscykgPiAwKSB7CiMgICAgICAgICBiaW5kX3Jvd3MobHMpCiMgICAgICAgfQojICAgICB9KSkpICU+JQojICAgZmlsdGVyKCFpcy5uYShGMTRDKSkKYGBgCgojIyMgTWFzcwoKYGBge3IgbG9hZC1mcmMtbWFzcy1kYXRhfQojIGxvYWQgcmF3IGRhdGEKc3JhLmZyYy5tc3MucmF3IDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEvcmF3L2xhYl9qZW5hX3Jlc3VsdHMtZnJjMTktZnJjMDFfMjAyMS0wNS0wNS9EaWNodGVmcmFrdGlvbmllcnVuZ19KZWZmXzIwMjAueGxzIiwgc2hlZXQgPSAiVGFiZWxsZTEiKQoKIyBmaWx0ZXIgYW5kIHJlZHVjZQpzcmEuZnJjLm1zcy5kZiA8LSBzcmEuZnJjLm1zcy5yYXcgJT4lCiAgZmlsdGVyKGlzLm5hKFNhbXBsZVJlZG9uZSkpICU+JQogIHNlbGVjdChQcm9iZSwgYEVpbndhYWdlIChnKWAsIEZyYWt0aW9uLCBgTEYgKGcpYCwgYEhGIChnKWApICU+JQogIG11dGF0ZSh5aWVsZCA9IGlmZWxzZShpcy5uYShgTEYgKGcpYCksIGBIRiAoZylgLCBgTEYgKGcpYCkpICU+JQogIHNlbGVjdCgtYyhgTEYgKGcpYCwgYEhGIChnKWApKSAlPiUKICByZW5hbWUod3RfZyA9IGBFaW53YWFnZSAoZylgKQoKIyAxKSBjb21iaW5lIG11bHRpcGxlIGZsYXNrIHNhbXBsZXMgZm9yIGluZGl2aWR1YWwgZmxhc2tzCiMgMikgZmlsbCBpbiBtaXNzaW5nIG9QT00gZGF0YSBmcm9tIDIwMTkgR1JyZiBzaXRlcwojIE5COiBhbG1vc3Qgbm8gbG9zcyBmb3IgMjAwMSBzaXRlcywgc28gc2VlbXMganVzdGlmaWVkIHRvIGFzc3VtZSBub25lIGluIDIwMTkKc3JhLmZyYy5tc3Mud2lkZS5kZiA8LSBiaW5kX3Jvd3MoCiAgbGFwcGx5KHNwbGl0KHNyYS5mcmMubXNzLmRmLCBzcmEuZnJjLm1zcy5kZiRQcm9iZSksIGZ1bmN0aW9uKGRmKSB7CiAgICBpZiAobnJvdyhkZikgPiAzKSB7CiAgICAgIGRmIDwtIGRmICU+JSAKICAgICAgICBncm91cF9ieShGcmFrdGlvbiwgUHJvYmUsIHd0X2cpICU+JQogICAgICAgIHN1bW1hcml6ZSh5aWVsZCA9IHN1bSh5aWVsZCksIC5ncm91cHMgPSAiZHJvcCIpCiAgICB9CiAgICByZXR1cm4oZGYpCiAgfSkpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBGcmFrdGlvbiwgdmFsdWVzX2Zyb20gPSB5aWVsZCkgJT4lCiAgcmVuYW1lKEZQT00gPSBmUE9NLCBPUE9NID0gb1BPTSwgTU9NID0gSEYpICU+JQogIG11dGF0ZShPUE9NID0gaWZlbHNlKGlzLm5hKE9QT00pLCB3dF9nIC0gRlBPTSAtIE1PTSwgT1BPTSkpCgojIHN1bSBtYXNzCnNyYS5mcmMubXNzLndpZGUuZGYkbWFzc19zdW0gPC0gcm93U3VtcyhzcmEuZnJjLm1zcy53aWRlLmRmWyAsIGMoIkZQT00iLCAiT1BPTSIsICJNT00iKV0pCgojIHBpdm90IGxvbmdlciBhbmQgY2FsY3VsYXRlIG1hc3MgcGN0CnNyYS5mcmMubXNzLmxvbmcuZGYgPC0gc3JhLmZyYy5tc3Mud2lkZS5kZiAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IGMoIkZQT00iLCAiT1BPTSIsICJNT00iKSwgbmFtZXNfdG8gPSAiZnJjIiwgdmFsdWVzX3RvID0gIm1hc3NfZyIpICU+JQogIG11dGF0ZShtYXNzX3BjdCA9IHJvdW5kKG1hc3NfZyAvIG1hc3Nfc3VtICogMTAwLCAxKSwKICAgICAgICAgZGVwdGggPSBzYXBwbHkoc3Ryc3BsaXQoUHJvYmUsICJfKD8hLipfKSIsIHBlcmwgPSBUUlVFKSwgIltbIiwgMiksCiAgICAgICAgIGx5cl90b3AgPSBhcy5udW1lcmljKHNhcHBseShzdHJzcGxpdChkZXB0aCwgIlstXSIpLCAiW1siLCAxKSksCiAgICAgICAgIGx5cl9ib3QgPSBhcy5udW1lcmljKHNhcHBseShzdHJzcGxpdChkZXB0aCwgIlstXSIpLCAiW1siLCAyKSksCiAgICAgICAgIHllYXIgPSBhcy5udW1lcmljKHNhcHBseShzdHJzcGxpdChQcm9iZSwgIl8iKSwgIltbIiwgMykpLAogICAgICAgICBQTWVjbyA9IHNhcHBseShzdHJzcGxpdChQcm9iZSwgIl8iKSwgIltbIiwgMSkpICU+JQogIGFycmFuZ2UobHlyX2JvdCkKCiMgc3BsaXQgYnkgeWVhcgpzcmEuZnJjLm1zcy5sb25nLjAxLmRmIDwtIHNyYS5mcmMubXNzLmxvbmcuZGZbc3JhLmZyYy5tc3MubG9uZy5kZiR5ZWFyID09IDIwMDEsIF0Kc3JhLmZyYy5tc3MubG9uZy4xOS5kZiA8LSBzcmEuZnJjLm1zcy5sb25nLmRmW3NyYS5mcmMubXNzLmxvbmcuZGYkeWVhciA9PSAyMDE5LCBdCmBgYAoKCmBgYHtyIHBsb3QtZnJjLW1hc3MtbG9zc2VzfQojIGNhbGMgbG9zcywgZHJvcCBzYW1wbGVzIHdpdGhvdXQgYWxsIHdlaWdodHMKc3JhLmZyYy5tc3MubHNzLmRmIDwtIHNyYS5mcmMubXNzLndpZGUuZGYKc3JhLmZyYy5tc3MubHNzLmRmJHN1bSA8LSByb3dTdW1zKHNyYS5mcmMubXNzLmxzcy5kZlsgLCBjKCJGUE9NIiwgIk9QT00iLCAiTU9NIildKQpzcmEuZnJjLm1zcy5sc3MuZGYkbG9zcyA8LSBzcmEuZnJjLm1zcy5sc3MuZGYkd3RfZyAtIHNyYS5mcmMubXNzLmxzcy5kZiRzdW0Kc3JhLmZyYy5tc3MubHNzLmRmJGxvc3NfcGN0IDwtIChzcmEuZnJjLm1zcy5sc3MuZGYkbG9zcyAvIHNyYS5mcmMubXNzLmxzcy5kZiR3dF9nKSAqIDEwMAogIAojIHN1bW1hcml6ZSBsb3NzZXMgYnkgUE0sIEVDTwpzcmEuZnJjLm1zcy5sc3MuZGYkUE0gPC0gc3Vic3RyKHNyYS5mcmMubXNzLmxzcy5kZiRQcm9iZSwgMSwgMikKc3JhLmZyYy5tc3MubHNzLmRmJEVDTyA8LSBmYWN0b3Ioc3Vic3RyKHNyYS5mcmMubXNzLmxzcy5kZiRQcm9iZSwgMywgNCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKQpzcmEuZnJjLm1zcy5sc3MuZGYkeWVhciA8LSBhcy5udW1lcmljKHN1YnN0cihzcmEuZnJjLm1zcy5sc3MuZGYkUHJvYmUsIDExLCAxNCkpCnNyYS5mcmMubXNzLmxzcy5kZiRkZXB0aCA8LSBzYXBwbHkoCiAgc3Ryc3BsaXQoc3JhLmZyYy5tc3MubHNzLmRmJFByb2JlLCAiXyg/IS4qXykiLCBwZXJsID0gVFJVRSksIAogICJbWyIsIDIpCnNyYS5mcmMubXNzLmxzcy5kZiRseXJfYm90IDwtIGFzLm51bWVyaWMoaWZlbHNlKG5jaGFyKHNyYS5mcmMubXNzLmxzcy5kZiRkZXB0aCkgPT0gMywgc3Vic3RyKHNyYS5mcmMubXNzLmxzcy5kZiRkZXB0aCwgMywgMyksIGlmZWxzZShuY2hhcihzcmEuZnJjLm1zcy5sc3MuZGYkZGVwdGgpID09IDQsIHN1YnN0cihzcmEuZnJjLm1zcy5sc3MuZGYkZGVwdGgsIDMsIDQpLCBzdWJzdHIoc3JhLmZyYy5tc3MubHNzLmRmJGRlcHRoLCA0LCA1KSkpKQoKIyMgc3VtbWFyaXplCiMgc3VtbWFyeShsbShsb3NzX3BjdCB+IFBNICsgRUNPICsgeWVhciArIGx5cl9ib3QsIAojICAgICAgICAgICAgc3JhLmZyYy5tc3MubHNzLmRmWy13aGljaChzcmEuZnJjLm1zcy5sc3MuZGYkUHJvYmUgPT0gIkJTcHBfY29tcF8yMDAxXzE4LTI4IiksIF0pKQpzdW1tYXJ5KGxtKGxvc3NfcGN0IH4gUE0gKyBFQ08sIAogICAgICAgICAgIHNyYS5mcmMubXNzLmxzcy5kZlstd2hpY2goc3JhLmZyYy5tc3MubHNzLmRmJFByb2JlID09ICJCU3BwX2NvbXBfMjAwMV8xOC0yOCIpLCBdKSkKCiMgcGxvdApzcmEuZnJjLm1zcy5sc3MuZGYgJT4lCiAgcmVuYW1lKGBNYXNzIGxvc3MgKCUpYCA9IGxvc3NfcGN0KSAlPiUKICBtdXRhdGUoZWNvID0gZmFjdG9yKGlmZWxzZShFQ08gPT0gInBwIiwgIndhcm0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKEVDTywgYE1hc3MgbG9zcyAoJSlgLCBjb2xvciA9IHBtLCBzaGFwZSA9IGVjbykpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gYmFzYWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9IGdyYW5pdGUpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoIndhcm0iID0gMTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQiID0gMTYpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyh5ZWFyKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKSW50ZXJlc3RpbmdseSwgaXQgYXBwZWFycyB0aGF0IEFOIHNvaWxzIGhhdmUgcHJvcG9ydGlvbmFsbHkgTEVTUyBtaW5DIGJ5IG1hc3MgdGhhbiBkbyBHUiBvciBCUyBzb2lscywgc2lnbmlmaWNhbnRseSBzbyBhdCBkZXB0aC4gV2h5IHdvdWxkIHRoaXMgYmU/IFBvc3NpYmx5IGJlY2F1c2UgQU4gc29pbHMgaGF2ZSBoaWdoZXIgbG9zc2VzIChET0MpIGR1cmluZyBmcmFjdGlvbmF0aW9uPwoKIyMgRXh0ZXJuYWwgZGF0YQojIyMgQXRtb3NwaGVyZQoKYGBge3IgYXRtMTRjLWRhdGF9CkRhdG0gPC0gcmJpbmQoZ3JhdmVuLCBmdXR1cmUxNEMpCmF0bS4xNGMgPC0gZGF0YS5mcmFtZSh5ZWFyID0gRGF0bVtEYXRtJERhdGUgPiAyMDAwLCAiRGF0ZSJdLAogICAgICAgICAgICAgICAgICAgICAgZDE0YyA9IERhdG1bRGF0bSREYXRlID4gMjAwMCwgIk5IYzE0Il0sCiAgICAgICAgICAgICAgICAgICAgICBUeXBlID0gImF0bW9zcGhlcmUiKQpgYGAKCiMjIyBmcm9tIEMuIFJhc211c3NlbiAoJzAxIEMsIE47ICcwOSAxNEMsIGZyYyBtYXNzLCBDLCBOKQoKYGBge3IgbG9hZC1yYXMtMDEtMDktZGF0YX0KIyBSYXNtdXNzZW4gMjAwMSBkYXRhCiMjIDIwMDEgc3VtbWFyeSBkYXRhCnNvYy4yMDAxIDwtIGRhdGEuZnJhbWUocmVhZF9leGNlbCgiLi4vZGF0YS9leHRlcm5hbC9zcmFfcmFzX3N1bS9zaWVycmFfZGF0YV9zdW1tYXJ5XzIwMjAueGxzeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVldCA9ICIyMDAxX2J1bGtfZGF0YSIpKQoKIyBSYXNtdXNzZW4gMjAwOSBkYXRhCiMjIDIwMDkgZnJhY3Rpb24gQywgTiwgbWFzcyBkYXRhCnNyYS4wOS5mcmMucmF3IDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEvZXh0ZXJuYWwvc3JhX3Jhc19zdW0vc2llcnJhX2RhdGFfc3VtbWFyeV8yMDIwLnhsc3giLCBzaGVldCA9ICIyMDA5X2ZyYWN0aW9uX2RhdGEiKSAlPiUgdHlwZS5jb252ZXJ0KC4sIGFzLmlzID0gVFJVRSkgJT4lIGRhdGEuZnJhbWUKCiMjIDIwMDkgc3VtbWFyeSBkYXRhCnNyYS4wOS5zdW0gPC0gcmVhZF9leGNlbCgiLi4vZGF0YS9leHRlcm5hbC9zcmFfcmFzX3N1bS9zaWVycmFfZGF0YV9zdW1tYXJ5XzIwMjAueGxzeCIsIHNoZWV0ID0gIkRhdGFfU3VtbWFyeV8yMDE4X3BhcGVyIikgJT4lIHR5cGUuY29udmVydCguLCBhcy5pcyA9IFRSVUUpICU+JSBkYXRhLmZyYW1lCgojIyAyMDA5IGJ1bGsgQwpzb2MuMDkuYmxrQy5kZiA8LSByZWFkX2V4Y2VsKCIuLi9kYXRhL2V4dGVybmFsL3NyYV9yYXNfc3VtL3NpZXJyYV9kYXRhX3N1bW1hcnlfMjAyMC54bHN4Iiwgc2hlZXQgPSAiMjAwOV9idWxrX2RhdGEiKSAlPiUgdHlwZS5jb252ZXJ0KC4sIGFzLmlzID0gVFJVRSkgJT4lIGRhdGEuZnJhbWUKCiMgUmFzbXVzc2VuIDIwMDkgMTRDIGRhdGE6IElTUmFECiMjIHJlYWQgSVNSYUQgZngKc3JhLjA5LmlzcmFkIDwtIElTUmFELnJlYWQuZW50cnkoIi4uL2RhdGEvZXh0ZXJuYWwvc3JhX3Jhc19JU1JhRC9SYXNtdXNzZW5fMjAxOC54bHN4IikKCiMgZ2V0IGx5ciBkYXRhCnNyYS4wOS5seXIuZGYgPC0gc3JhLjA5LmlzcmFkJFJhc211c3Nlbl8yMDE4JGxheWVyCgojIGdldCBmcmMgZGF0YQpzcmEuMDkuZnJjLmRmIDwtIG1lcmdlKAogIHNyYS4wOS5pc3JhZCRSYXNtdXNzZW5fMjAxOCRmcmFjdGlvbiwKICBzcmEuMDkuaXNyYWQkUmFzbXVzc2VuXzIwMTgkbGF5ZXJbLCBjKCJwcm9fbmFtZSIsICJseXJfbmFtZSIsICJseXJfYm90IiwgImx5cl90b3AiLCAibHlyX2Nfb3JnIiwgImx5cl9uX3RvdCIsICJseXJfc29jIiwgImx5cl9vYnNfZGF0ZV95IildLCBieSA9IGMoInByb19uYW1lIiwgImx5cl9uYW1lIikpCgojIyBmaWxsIG1pc3NpbmcgZDE0YyBkYXRhCml4IDwtIHdoaWNoKGlzLm5hKHNyYS4wOS5mcmMuZGYkZnJjXzE0YykgJiAhaXMubmEoc3JhLjA5LmZyYy5kZiRmcmNfZnJhY3Rpb25fbW9kZXJuKSkKc3JhLjA5LmZyYy5kZltpeCwgImZyY18xNGMiXSA8LSBjb252ZXJ0X2ZtX2QxNGMoCiAgZm0gPSBzcmEuMDkuZnJjLmRmW2l4LCAiZnJjX2ZyYWN0aW9uX21vZGVybiJdLCAKICBvYnNfZGF0ZV95ID0gc3JhLjA5LmZyYy5kZltpeCwgImx5cl9vYnNfZGF0ZV95Il0pCgojIyByZXNoYXBlIElTUmFEIGRhdGEgdG8gbWVyZ2Ugd2l0aCBkZW5zLmRmCnNyYS5mcmMuMTRjIDwtIHNyYS4wOS5mcmMuZGYgJT4lCiAgbXV0YXRlKFBNZWNvID0gYXMuY2hhcmFjdGVyKHByb19uYW1lKSwKICAgICAgICAgUE0gPSBzdWJzdHIoUE1lY28sIDEsIDIpLAogICAgICAgICBFQ08gPSBzdWJzdHIoUE1lY28sIDMsIDQpLAogICAgICAgICBwcm9fbmFtZSA9IHBhc3RlMChQTWVjbywgIl8iLCBseXJfb2JzX2RhdGVfeSksCiAgICAgICAgIGZyYyA9IGlmZWxzZShmcmNfcHJvcGVydHkgPT0gImZyZWUgbGlnaHQiLCAiZlBPTSIsIAogICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGZyY19wcm9wZXJ0eSA9PSAiaGVhdnkiLCAibWluQyIsICJvUE9NIikpLAogICAgICAgICBZZWFyID0gMjAwOSkgJT4lICMgbm90ZSB0aGF0IEdSIHNhbXBsZXMgd2VyZSB0ZWNobmljYWxseSBjb2xsZWN0ZWQgaW4gMjAxMC4uLgogIHNlbGVjdChmcmNfZnJhY3Rpb25fbW9kZXJuLCBmcmNfZnJhY3Rpb25fbW9kZXJuX3NpZ21hLCBmcmNfMTRjLCBmcmNfMTRjX3NpZ21hLCBmcmMsIFBNZWNvLCBQTSwgRUNPLCBZZWFyLCBwcm9fbmFtZSwgbHlyX3RvcCwgbHlyX2JvdCkgJT4lIAogIHJlbmFtZShGMTRDID0gZnJjX2ZyYWN0aW9uX21vZGVybiwKICAgICAgICAgZXJyID0gZnJjX2ZyYWN0aW9uX21vZGVybl9zaWdtYSwKICAgICAgICAgZnJjXzE0Y19lcnIgPSBmcmNfMTRjX3NpZ21hKSAKYGBgCgojIEFuYWx5c2lzCiMjIE1pc2MuIGZ1bmN0aW9ucwoKYGBge3IgZGVmaW5lLUMtc3BsaW5lLWZ4c30KIyBkZXB0aCBzcGxpbmUgZm9yIEMgcGVyY2VudCwgd2hlcmUgZCA9IHZlY3RvciBvZiBsYXllciBib3R0b20gZGVwdGhzCkNzcGxpbmUuZnggPC0gZnVuY3Rpb24oZGYsIHZhci5uYW1lLCBkID0gYygxMCwgMjAsIDMwKSkgewogIGJpbmRfcm93cyhsYXBwbHkoc3BsaXQoZGYsIGRmJHByb19uYW1lKSwgZnVuY3Rpb24oeCkgewogICAgZGVwdGhzKHgpIDwtIHByb19uYW1lIH4gbHlyX3RvcCArIGx5cl9ib3QKICAgIHgubXBzIDwtIG1wc3BsaW5lKHgsIHZhci5uYW1lID0gdmFyLm5hbWUsIGQgPSB0KGMoMCwgZCkpKQogICAgeC5zdGQgPC0gdCh4Lm1wcyR2YXIuc3RkKQogICAgZGYgPC0gZGF0YS5mcmFtZShjX3BjdCA9IHguc3RkLCBkZXB0aCA9IHJvdy5uYW1lcyh4LnN0ZCkpCiAgICBkZiRkZXB0aCA8LSBnc3ViKCIgW14gXSokIiwgIiIsIGRmJGRlcHRoKQogICAgcmV0dXJuKGRmWzE6bGVuZ3RoKGQpLCBdKQogIH0pLCAuaWQgPSAicHJvX25hbWUiKQp9CgojIGRlcHRoIHNwbGluZSBmb3IgbW9ub3RvbmljIGN1bXVsYXRpdmUgQyBzdG9ja3M7IE5COiBpbnB1dCBtdXN0IGJlIDItY29sIGRmIHcvIGRlcHRoICgxKSBhbmQgY210diBTT0MgKDIpClNPQ3NwbGluZS5meCA8LSBmdW5jdGlvbih4LCBkZXB0aHMsIHNvYykgewogIHQwIDwtIGRhdGEuZnJhbWUobHlyX2JvdCA9IDApCiAgdDBbW3NvY11dIDwtIDAKICB0MC54IDwtIHJiaW5kKHQwLCB4KQogIAogICMgZml0IG1vbm90b25pYyBjdWJpYyBzcGxpbmUKICBzcCA8LSBzcGxpbmUodDAueCwgbWV0aG9kID0gImh5bWFuIikgCiAgCiAgIyBjb252ZXJ0IHRvIGNsYXNzICJzcGxpbmUiIHdpdGggc21vb3RoLnNwbGluZSBmeG4KICBzcC5zcyA8LSBzbW9vdGguc3BsaW5lKHNwLCBhbGwua25vdHMgPSBUUlVFKSAKICBtYXguZCA8LSBtYXgoeFsgLCAxXSkKICBpZiAobWF4LmQgPCAzMSkgewogICAgbWF4LmQgPC0gMzEKICB9CiAgCiAgIyBwcmVkaWN0IGF0IGdpdmVuIGRlcHRocyAobGluZWFyIGJleW9uZCBsYXN0IG1lYXN1cmVkIGRlcHRoKQogIHNwcCA8LSBwcmVkaWN0KHNwLnNzLCBkZXB0aHMpIAogIGRmIDwtIGRhdGEuZnJhbWUoc3BwKQogIGNvbG5hbWVzKGRmKSA8LSBjKCJseXJfYm90IiwgImx5cl9zb2MiKSAKICAKICAjIGNhbGN1bGF0ZSBzb2MgcGVyIGluY3JlbWVudCBmcm9tIGNtdHYgdmFsdWVzCiAgZm9yKGkgaW4gc2VxX2Fsb25nKGRmJGx5cl9ib3QpKSB7CiAgICBpZihpID09IDEpIHsKICAgICAgZGYkbHlyX3NvY1tpXSA8LSBkZiRseXJfc29jW2ldCiAgICB9IGVsc2UgewogICAgICBkZiRseXJfc29jW2ldIDwtIGRmJGx5cl9zb2NbaSArIDFdIC0gZGYkbHlyX3NvY1tpXQogICAgfQogIH0KICAKICAjIHJldHVybiAKICBkZiRseXJfYm90IDwtIGRmJGx5cl9ib3QgKyAxCiAgcmV0dXJuKGRmWy1sZW5ndGgoZGYkbHlyX3NvYyksIF0pCn0KYGBgCgojIyBCdWxrIEMKIyMjIDIwMDEKYGBge3IgYmxrYy1kYXRhLTIwMDF9CiMgRnJhY3Rpb24gc2FtcGxlcyBjb21iaW5lZCAwLTMgYW5kIDMtOCBkZXB0aCBpbmNyZW1lbnRzIGZvciBCU3JmIGFuZCBHUnJmCiMjIGZ1bmN0aW9uIGZvciBjYWxjdWxhdGluZyBkZXB0aC13ZWlnaHRlZCBhdmVyYWdlIG9mIGZpcnN0IHR3byBkZXB0aCBpbmNyZW1lbnQgQyBjb250ZW50CmQxZDIuZnggPC0gZnVuY3Rpb24oZGYpIHsKICBkMWQyIDwtIGRhdGEuZnJhbWUoSUQgPSBwYXN0ZShkZiRQTWVjb1sxXSwgZGYkcHJvX3JlcFsxXSwgZGYkbHlyX3RvcFsxXSwgZGYkbHlyX2JvdFsyXSwgc2VwID0gIl8iKSwKICAgICAgICAgICAgICAgICAgICAgUE1lY28gPSBkZiRQTWVjb1sxXSwKICAgICAgICAgICAgICAgICAgICAgbWFzc19rZ20yID0gc3VtKGRmJG1hc3Nfa2dtMlsxXSwgZGYkbWFzc19rZ20yWzJdKSwKICAgICAgICAgICAgICAgICAgICAgY19wY3QgPSBzdW0oZGYkY19wY3RbMV0gKiAoKGRmJGx5cl9ib3RbMV0gLSBkZiRseXJfdG9wWzFdKSAvIGRmJGx5cl9ib3RbMl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZiRjX3BjdFsyXSAqICgoZGYkbHlyX2JvdFsyXSAtIGRmJGx5cl90b3BbMl0pIC8gZGYkbHlyX2JvdFsyXSkpLAogICAgICAgICAgICAgICAgICAgICBseXJfc29jX2tnbTIgPSBzdW0oZGYkbHlyX3NvY19rZ20yWzFdLCBkZiRseXJfc29jX2tnbTJbMl0pLAogICAgICAgICAgICAgICAgICAgICBwcm9fbmFtZSA9IGRmJHByb19uYW1lWzFdLAogICAgICAgICAgICAgICAgICAgICBseXJfdG9wID0gZGYkbHlyX3RvcFsxXSwKICAgICAgICAgICAgICAgICAgICAgbHlyX2JvdCA9IGRmJGx5cl9ib3RbMl0pCiAgcmV0dXJuKHJiaW5kKGQxZDIsCiAgICAgICAgICAgICAgIGRmWzM6bnJvdyhkZiksIF0pKQp9CgojIENyZWF0ZSBsaXN0CnNvYy4yMDAxLmxzIDwtIGxhcHBseShzcGxpdChzb2MuMjAwMSwgc29jLjIwMDEkUE1lY28pLCBmdW5jdGlvbihkZikgewogIAogICMgcmVtb3ZlIE5BcwogIGRmIDwtIHR5cGUuY29udmVydChkZltjb21wbGV0ZS5jYXNlcyhkZiksIF0pCiAgCiAgIyBmaWx0ZXIgPCAzNmNtLCByZW5hbWUgY19wY3QsIGFkZCBtYXNzIGFuZCBzb2Mgc3RvY2sgY29sdW1ucwogIGRmIDwtIGRmICU+JQogICAgZmlsdGVyKGx5cl9ib3QgPCAzNikgJT4lCiAgICByZW5hbWUoY19wY3QgPSBDLikgJT4lCiAgICBtdXRhdGUobWFzc19rZ20yID0gYmQuZy5jbTMgKiAobHlyX2JvdCAtIGx5cl90b3ApICogZmluZS5lYXJ0aC4gKiAuMSwKICAgICAgICAgICBseXJfc29jX2tnbTIgPSBtYXNzX2tnbTIgKiBjX3BjdCAqIDEwXi0yLAogICAgICAgICAgIHByb19uYW1lID0gcGFzdGUoUE1lY28sIHByb19yZXAsIHNlcCA9ICJfIikpICU+JQogICAgc2VsZWN0KElELCBQTWVjbywgbWFzc19rZ20yLCBjX3BjdCwgbHlyX3NvY19rZ20yLCBwcm9fbmFtZSwgbHlyX3RvcCwgbHlyX2JvdCkKICAKICAjIGNvbWJpbmUgMC0zLCAzLTggY20gZGVwdGhzIGZvciBHUnJmLCBCU3JmCiAgaWYgKGRmJFBNZWNvWzFdID09ICJHUnJmIiB8IGRmJFBNZWNvWzFdID09ICJCU3JmIikgewogICAgZGY8LSBiaW5kX3Jvd3MobGFwcGx5KHNwbGl0KGRmLCBkZiRwcm9fbmFtZSksIGQxZDIuZngpKQogIH0KCiAgIyBjYWxjdWxhdGUgY210diBzb2Mgc3RvY2tzCiAgbHMgPC0gc3BsaXQoZGYsIGRmJHByb19uYW1lKQogIGxzIDwtIGxhcHBseShscywgZnVuY3Rpb24oeCkgewogICAgeCA8LSB4W29yZGVyKHgkbHlyX2JvdCksIF0gIyBtYWtlIHN1cmUgdG8gb3JkZXIgZGF0YQogICAgeCRseXJfc29jX2NtdHYgPC0gTkEKICAgIGZvcihpIGluIHNlcV9hbG9uZyh4JGx5cl9ib3QpKSB7CiAgICAgIGlmKGkgPT0gMSkgewogICAgICAgIHgkbHlyX3NvY19jbXR2W2ldIDwtIHgkbHlyX3NvY19rZ20yW2ldCiAgICAgIH0gZWxzZSB7CiAgICAgICAgeCRseXJfc29jX2NtdHZbaV0gPC0geCRseXJfc29jX2tnbTJbaV0gKyB4JGx5cl9zb2NfY210dltpLTFdIAogICAgICB9CiAgICB9CiAgICByZXR1cm4oeCkKICB9KQogIHJldHVybih1bnNwbGl0KGxzLCBkZiRwcm9fbmFtZSkpCn0pCgojIHN1bW1hcml6ZQpzb2MuMjAwMS5zdW0uZGYgPC0gYmluZF9yb3dzKHNvYy4yMDAxLmxzKSAlPiUKICBncm91cF9ieShQTWVjbywgbHlyX3RvcCwgbHlyX2JvdCkgJT4lCiAgc3VtbWFyaXplKGFjcm9zcyhjKG1hc3Nfa2dtMiwgY19wY3QsIGx5cl9zb2Nfa2dtMiwgbHlyX3NvY19jbXR2KSwgCiAgICAgICAgICAgIC5mbnMgPSBsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSksIC5ncm91cHMgPSAiZHJvcCIpICU+JQogIG11dGF0ZShJRDIgPSBwYXN0ZTAoUE1lY28sICJfIiwgbHlyX3RvcCwgIi0iLCBseXJfYm90KSkKYGBgCgojIyMgMjAwOQpgYGB7ciBjLWRhdGEtMjAwOX0KIyBjYWxjdWxhdGUgY3VtdWxhdGl2ZSBzb2Mgc3RvY2tzIGZvciAnMDkgZGF0YQpzcmEuMDkubHlyLkMgPC0gdW5zcGxpdChsYXBwbHkoCiAgc3BsaXQoc29jLjA5LmJsa0MuZGYsIHNvYy4wOS5ibGtDLmRmJHByb19uYW1lKSwgZnVuY3Rpb24oeCkgewogICAgbmFtZXMoeClbd2hpY2gobmFtZXMoeCkgPT0gImJvdHRvbS5taW5lcmFsIildIDwtICJseXJfYm90IgogICAgeCRFQ08gPC0gdG9sb3dlcih4JEJpb21lKQogICAgeCRQTWVjbyA8LSBwYXN0ZTAoeCRQTSwgeCRFQ08pCiAgICB4IDwtIHhbb3JkZXIoeCRseXJfYm90KSwgXSAjIG1ha2Ugc3VyZSB0byBvcmRlciBkYXRhCiAgICB4JGx5cl9zb2Nfa2dtMiA8LSB4JEJEX2dfY21fMyAqIHgkVGhpY2tuZXNzX2NtICogeCRTb2lsX2ZpbmVmcmFjdGlvbiAqIC4xICogeCRDX3BjdAogICAgeCRseXJfc29jX2NtdHYgPC0gTkEKICAgIGZvcihpIGluIHNlcV9hbG9uZyh4JGx5cl9ib3QpKSB7CiAgICAgIGlmKGkgPT0gMSkgewogICAgICAgIHgkbHlyX3NvY19jbXR2W2ldIDwtIHgkbHlyX3NvY19rZ20yW2ldCiAgICAgIH0gZWxzZSB7CiAgICAgICAgeCRseXJfc29jX2NtdHZbaV0gPC0geCRseXJfc29jX2tnbTJbaV0gKyB4JGx5cl9zb2NfY210dltpLTFdIAogICAgICB9CiAgICB9CiAgICByZXR1cm4oeCkKICB9KSwgc29jLjA5LmJsa0MuZGYkcHJvX25hbWUpCmBgYAoKIyMjIDIwMTkKCmBgYHtyIGxvYWQtMjAxOS1zb2N9CmxvYWQoIi9Vc2Vycy9qZWZmL3NyYS10cy9zb3VyY2Uvc3JhLjIwMTkubHMuUkRhdGEiKQpzcmEuc29jLjIwMTkuZGYgPC0gYmluZF9yb3dzKGxhcHBseShzcmEuMjAxOS5scywgZnVuY3Rpb24oZGYpIHsKICBkZiAlPiUKICAgIGZpbHRlcihseXJfYm90IDwgMzEpICU+JQogICAgZ3JvdXBfYnkoUE0sIEVDTywgbHlyX2JvdCkgJT4lCiAgICBzdW1tYXJpemUoYWNyb3NzKGMoQywgbHlyX3NvYyksIG1lYW4pLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICAgIHJlbmFtZShjX3BjdF9seXIgPSBDKQp9KSkKYGBgCgojIyBGcmFjdGlvbiBDCiMjIyBDLCBDTiBwcm9maWxlcwoKYGBge3IgcGxvdC1jLW4tY259CiMgcGxvdCBkZXB0aCBwcm9maWxlcwojIHBsb3QgZngKZnJjLnByby5wbG90IDwtIGZ1bmN0aW9uKGRmLCB5ZWFyLCBmcmFjdGlvbiwgeCkgewogIHF1b194IDwtIHN5bSh4KQogIHhsYWIgPC0gaWZlbHNlKHggPT0gIkNOIiwgIkNOIiwgcGFzdGUoeCwgIiglKSIpKQogIGRmJEVDTyA8LSBmYWN0b3IoZGYkRUNPLCBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKQogIGRmIDwtIGRmW29yZGVyKGRmJGx5cl9ib3QpLCBdCiAgZGYkbWlkZGVwdGggPC0gZGYkbHlyX3RvcCArIChkZiRseXJfYm90IC0gZGYkbHlyX3RvcCkgLyAyCiAgZ2dwbG90KGRmLCBhZXMoISEgcXVvX3gsIG1pZGRlcHRoLCBjb2xvciA9IFBNLCBzaGFwZSA9IEVDTykpICsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICAgIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICAgIGdlb21fcGF0aCgpICsKICAgIHNjYWxlX3lfcmV2ZXJzZShsaW1pdHMgPSBjKDMwLCAwKSkgKwogICAgc2NhbGVfeF9jb250aW51b3VzKCkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBTiIgPSAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJiYXNhbHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJncmFuaXRlIiksCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiQU4iID0gYW5kZXNpdGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9IGJhc2FsdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gZ3Jhbml0ZSkpICsKICAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkNsaW1hdGUiLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoInBwIiA9ICJ3YXJtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZiIgPSAiY29sZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2YiID0gImNvb2wiKSwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJwcCIgPSAxNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmYiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndmIiA9IDE3KSkgKwogICAgeGxhYih4bGFiKSArCiAgICB5bGFiKCJEZXB0aCAoY20pIikgKwogICAgZ2d0aXRsZShwYXN0ZSh5ZWFyLCBmcmFjdGlvbikpICsKICAgIHRoZW1lX2J3KCkgKwogICAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKfQoKIyBDb21iaW5lIHByb2ZpbGVzIGZvciBwbG90dGluZwpmcmMuQy4wMS5wbG90LmxzIDwtIGxhcHBseShzcmEuZnJjLjIwMDEubHMsIGJpbmRfcm93cywgLmlkID0gImZyYWN0aW9uIikKbGFwcGx5KHNlcV9hbG9uZyhmcmMuQy4wMS5wbG90LmxzKSwgZnVuY3Rpb24oaSkgewogIGZyYy5wcm8ucGxvdChmcmMuQy4wMS5wbG90LmxzW1tpXV0sIDIwMDEsIG5hbWVzKGZyYy5DLjAxLnBsb3QubHMpW2ldLCAiQyIpCn0pCgpmcmMuQy4xOS5wbG90LmxzIDwtIGxhcHBseShzcmEuZnJjLjIwMTkubHMsIGJpbmRfcm93cywgLmlkID0gImZyYWN0aW9uIikKbGFwcGx5KHNlcV9hbG9uZyhmcmMuQy4xOS5wbG90LmxzKSwgZnVuY3Rpb24oaSkgewogIGZyYy5wcm8ucGxvdChmcmMuQy4xOS5wbG90LmxzW1tpXV0sIDIwMTksIG5hbWVzKGZyYy5DLjE5LnBsb3QubHMpW2ldLCAiQyIpCn0pCgojIENhbGN1bGF0ZSBhbmQgcGxvdCBDTgpsYXBwbHkoc2VxX2Fsb25nKGZyYy5DLjAxLnBsb3QubHMpLCBmdW5jdGlvbihpKSB7CiAgZnJjLkMuMDEucGxvdC5sc1tbaV1dW1siQ04iXV0gPC0gZnJjLkMuMDEucGxvdC5sc1tbaV1dW1siQyJdXSAvIGZyYy5DLjAxLnBsb3QubHNbW2ldXVtbIk4iXV0KICBmcmMucHJvLnBsb3QoZnJjLkMuMDEucGxvdC5sc1tbaV1dLCAyMDAxLCBuYW1lcyhmcmMuQy4wMS5wbG90LmxzKVtpXSwgIkNOIikKfSkKbGFwcGx5KHNlcV9hbG9uZyhmcmMuQy4xOS5wbG90LmxzKSwgZnVuY3Rpb24oaSkgewogIGZyYy5DLjE5LnBsb3QubHNbW2ldXVtbIkNOIl1dIDwtIGZyYy5DLjE5LnBsb3QubHNbW2ldXVtbIkMiXV0gLyBmcmMuQy4xOS5wbG90LmxzW1tpXV1bWyJOIl1dCiAgZnJjLnByby5wbG90KGZyYy5DLjE5LnBsb3QubHNbW2ldXSwgMjAxOSwgbmFtZXMoZnJjLkMuMTkucGxvdC5scylbaV0sICJDTiIpCn0pCmBgYAoKIyMjIEMgZGlzdHJpYnV0aW9uCgpgYGB7ciBtZXJnZS1mcmMtbWFzcy1DfQojIyBtZXJnZSBDIGFuZCBtYXNzIGRhdGEKIyAnMDEKc3JhLmZyYy5tc3MuQy4wMS5kZiA8LSBtZXJnZSgKICBiaW5kX3Jvd3MoCiAgICBsYXBwbHkoc3JhLmZyYy4yMDAxLmxzLCBmdW5jdGlvbihscykgYmluZF9yb3dzKGxzLCAuaWQgPSAiUE1lY28iKSksIC5pZCA9ICJmcmMiKSwKICBzcmEuZnJjLm1zcy5sb25nLjAxLmRmLCBieSA9IGMoInllYXIiLCAiUE1lY28iLCAibHlyX2JvdCIsICJseXJfdG9wIiwgImZyYyIpKSAlPiUgCiAgbXV0YXRlKElEMiA9IHN1YigiY29tcF8yMDAxXyIsIHggPSBJRCwgcmVwbGFjZW1lbnQgPSAiIikpCgojIGNhbGN1bGF0ZSBDIHdlaWdodHMKc3JhLmZyYy5tc3MuQy4wMS5kZiRtYXNzX2NfZyA8LSBzcmEuZnJjLm1zcy5DLjAxLmRmJG1hc3Nfc3VtICogKHNyYS5mcmMubXNzLkMuMDEuZGYkbWFzc19wY3QgLyAxMDApICogKHNyYS5mcmMubXNzLkMuMDEuZGYkQyAvIDEwMCkKCiMgY2FsYyBzeW50aGV0aWMgbHlyX2MgKGFzIHN1bSBvZiBmcmMgYyBtYXNzZXMpIGFuZCBwZXJjZW50CmlmICghKCJseXJfY19tYXNzX3N5biIgJWluJSBuYW1lcyhzcmEuZnJjLm1zcy5DLjAxLmRmKSkpIHsKICBzcmEuZnJjLm1zcy5DLjAxLmRmIDwtIHNyYS5mcmMubXNzLkMuMDEuZGYgJT4lCiAgICBncm91cF9ieSh5ZWFyLCBQTWVjbywgbHlyX2JvdCkgJT4lCiAgICBzdW1tYXJpemUobHlyX2NfbWFzc19zeW4gPSBzdW0obWFzc19jX2cpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICAgIHJpZ2h0X2pvaW4oLiwgc3JhLmZyYy5tc3MuQy4wMS5kZiwgYnkgPSBjKCJ5ZWFyIiwgIlBNZWNvIiwgImx5cl9ib3QiKSkKfQpzcmEuZnJjLm1zcy5DLjAxLmRmJGZyY19jX3BjdCA8LSBzcmEuZnJjLm1zcy5DLjAxLmRmJG1hc3NfY19nIC8gc3JhLmZyYy5tc3MuQy4wMS5kZiRseXJfY19tYXNzX3N5bgoKIyBhZGQgbHlyIEMKc3JhLmZyYy5tc3MuQy4wMS5kZiRseXJfY19wY3QgPC0gdW5saXN0KHNvYy4yMDAxLnN1bS5kZlsKICBtYXRjaChzcmEuZnJjLm1zcy5DLjAxLmRmJElEMiwgc29jLjIwMDEuc3VtLmRmJElEMiksICJjX3BjdF9tZWFuIl0pCgojIHJlbGV2ZWwgZnJhY3Rpb24gZmFjdG9yCnNyYS5mcmMubXNzLkMuMDEuZGYkZnJjIDwtIGZhY3RvcihzcmEuZnJjLm1zcy5DLjAxLmRmJGZyYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJGUE9NIiwgIk9QT00iLCAiTU9NIikpCgojIGNvbnZlcnQgdG8gZGF0YS5mcmFtZQpzcmEuZnJjLm1zcy5DLjAxLmRmIDwtIGRhdGEuZnJhbWUoc3JhLmZyYy5tc3MuQy4wMS5kZikKCiMgYWRkIG1pZGRlcHRoCnNyYS5mcmMubXNzLkMuMDEuZGYkbWlkZGVwdGggPC0gc3JhLmZyYy5tc3MuQy4wMS5kZiRseXJfdG9wICsKICAoc3JhLmZyYy5tc3MuQy4wMS5kZiRseXJfYm90IC0gc3JhLmZyYy5tc3MuQy4wMS5kZiRseXJfdG9wKSAvIDIKCiMgJzA5CiMgc3JhLjA5LmZyYy5DJGZyY19jX3BlcmMKCgojICcxOQpzcmEuZnJjLm1zcy5DLjE5LmRmIDwtIG1lcmdlKAogIGJpbmRfcm93cygKICAgIGxhcHBseShzcmEuZnJjLjIwMTkubHMsIGZ1bmN0aW9uKGxzKSBiaW5kX3Jvd3MobHMsIC5pZCA9ICJQTWVjbyIpKSwgLmlkID0gImZyYyIpLAogIHNyYS5mcmMubXNzLmxvbmcuMTkuZGYsIGJ5ID0gYygieWVhciIsICJQTWVjbyIsICJseXJfYm90IiwgImx5cl90b3AiLCAiZnJjIikpICU+JSAKICBtdXRhdGUoSUQyID0gc3ViKCJjb21wXzIwMTlfIiwgeCA9IElELCByZXBsYWNlbWVudCA9ICIiKSkKCiMgY2FsY3VsYXRlIEMgd2VpZ2h0cwpzcmEuZnJjLm1zcy5DLjE5LmRmJG1hc3NfY19nIDwtIHNyYS5mcmMubXNzLkMuMTkuZGYkbWFzc19zdW0gKihzcmEuZnJjLm1zcy5DLjE5LmRmJG1hc3NfcGN0IC8gMTAwKSAqIChzcmEuZnJjLm1zcy5DLjE5LmRmJEMgLyAxMDApCgojIGFkZCBseXIgQwpzcmEuZnJjLm1zcy5DLjE5LmRmJGx5cl9jX3BjdCA8LSB1bmxpc3Qoc3JhLmJsay4yMDE5LnN1bS5kZlsKICBtYXRjaChzcmEuZnJjLm1zcy5DLjE5LmRmJElEMiwgc3JhLmJsay4yMDE5LnN1bS5kZiRJRDIpLCAiQ19tZWFuIl0pCgojIGNhbGMgc3ludGhldGljIGx5cl9jIChhcyBzdW0gb2YgZnJjIGMgbWFzc2VzKSBhbmQgcGVyY2VudAppZiAoISgibHlyX2NfbWFzc19zeW4iICVpbiUgbmFtZXMoc3JhLmZyYy5tc3MuQy4xOS5kZikpKSB7CiAgc3JhLmZyYy5tc3MuQy4xOS5kZiA8LSBzcmEuZnJjLm1zcy5DLjE5LmRmICU+JQogICAgZ3JvdXBfYnkoeWVhciwgUE1lY28sIGx5cl9ib3QpICU+JQogICAgc3VtbWFyaXplKGx5cl9jX21hc3Nfc3luID0gc3VtKG1hc3NfY19nKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lCiAgICByaWdodF9qb2luKC4sIHNyYS5mcmMubXNzLkMuMTkuZGYsIGJ5ID0gYygieWVhciIsICJQTWVjbyIsICJseXJfYm90IikpCn0Kc3JhLmZyYy5tc3MuQy4xOS5kZiRmcmNfY19wY3QgPC0gc3JhLmZyYy5tc3MuQy4xOS5kZiRtYXNzX2NfZyAvIHNyYS5mcmMubXNzLkMuMTkuZGYkbHlyX2NfbWFzc19zeW4Kc3JhLmZyYy5tc3MuQy4xOS5kZiRFQ08gPC0gZmFjdG9yKHNyYS5mcmMubXNzLkMuMTkuZGYkRUNPLCBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKQpgYGAKCmBgYHtyIHBsb3QtZnJjQy1wY3QtZnh9CiMgYm94IHBsb3QgZngKZnJjX2NfcGN0LnBsb3QuZnggPC0gZnVuY3Rpb24oZGYsIGZpbGxfdmFyKSB7CiAgCiAgIyBzZXQgZmlsbCB2YXJpYWJsZSBhbmQgZ3VpZGVzCiAgcXVvX2ZpbGxfdmFyIDwtIHN5bShmaWxsX3ZhcikKICBpZiAoZmlsbF92YXIgPT0gIlBNIikgewogICAgZmlsbF92YWxzIDwtIGMoIkFOIiA9IGFuZGVzaXRlLCAiQlMiID0gYmFzYWx0LCAiR1IiID0gZ3Jhbml0ZSkKICB9IGVsc2UgewogICAgZmlsbF92YWxzIDwtIGMoInBwIiA9IHdhcm0sICJ3ZiIgPSBjb29sLCAicmYiID0gY29sZCkKICB9CiAgCiAgIyBwbG90CiBkZiAlPiUKICBtdXRhdGUoZnJjID0gZmFjdG9yKGZyYywgbGV2ZWxzID0gYygiRlBPTSIsICJPUE9NIiwgIk1PTSIpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhmcmMsIGZyY19jX3BjdCkpICsKICBnZW9tX2JveHBsb3QoYWVzKGZpbGwgPSAhISBxdW9fZmlsbF92YXIpLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBmaWxsX3ZhbHMpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGRlcHRoKSkgKwogIHlsYWIoIkMgcGFydGl0aW9uaW5nICglKSIpICsKICB4bGFiKE5VTEwpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKSAKfQpgYGAKCmBgYHtyIHBsb3QtZnJjQy1wY3QtMDF9CiMgMjAwMQojIyBwcmVwIGZ4CnNyYS5mcmMubXNzLkMuMDEucHJlcC5meCA8LSBmdW5jdGlvbihkZikgewogIGJpbmRfcm93cygKICAgIGxhcHBseShzcGxpdChkZiwgZGYkUE1lY28pLCBmdW5jdGlvbihkKSB7CiAgICAgIGJpbmRfcm93cyhsYXBwbHkoc3BsaXQoZCwgZCRmcmMpLCBmdW5jdGlvbihmKSB7CiAgICAgICAgZiA8LSBmW29yZGVyKGYkbHlyX2JvdCksIF0KICAgICAgICBmJGRlcHRoIDwtIHNlcSgxLCBucm93KGYpKQogICAgICAgIHJldHVybihmKQogICAgICB9KSkKICAgIH0pKQp9CgojIyBQTQpmcmNfY19wY3QucGxvdC5meChzcmEuZnJjLm1zcy5DLjAxLnByZXAuZngoc3JhLmZyYy5tc3MuQy4wMS5kZiksIAogICAgICAgICAgICAgICAgICBmaWxsX3ZhciA9ICJQTSIpCgojIyBFQ08KZnJjX2NfcGN0LnBsb3QuZngoc3JhLmZyYy5tc3MuQy4wMS5wcmVwLmZ4KHNyYS5mcmMubXNzLkMuMDEuZGYpLCAKICAgICAgICAgICAgICAgICAgZmlsbF92YXIgPSAiRUNPIikKYGBgCgpgYGB7ciBwbG90LWZyY0MtcGN0LTE5fQojIDIwMTkKZnJjX2NfcGN0LnBsb3QuZngoc3JhLmZyYy5tc3MuQy4xOS5kZiwgIlBNIikKZnJjX2NfcGN0LnBsb3QuZngoc3JhLmZyYy5tc3MuQy4xOS5kZiwgIkVDTyIpCmBgYAoKYGBge3IgY2FsYy1mcmMtQy1kaXN0ci1lcnJ9CiMgbWFrZSB3aWRlIGRhdGFmcmFtZSBmb3IgMjAxOSBmcmMgZGF0YQptZXJnZS52YXJzIDwtIGMoInllYXIiLCAiUE0iLCAiRUNPIiwgImx5cl9ib3QiKQpzcmEuZnJjLjIwMTkuZGYgPC0gbWVyZ2UoCiAgbWVyZ2UoYmluZF9yb3dzKHNyYS5mcmMuMjAxOS5scyRGUE9NKVssIGMobWVyZ2UudmFycywgIkMiLCAiTiIpXSwKICAgICAgICBiaW5kX3Jvd3Moc3JhLmZyYy4yMDE5LmxzJE9QT00pWywgYyhtZXJnZS52YXJzLCAiQyIsICJOIildLAogICAgICAgIGJ5ID0gbWVyZ2UudmFycywgc3VmZml4ZXMgPSBjKCJfZlBPTSIsICJfb1BPTSIpKSwKICBiaW5kX3Jvd3Moc3JhLmZyYy4yMDE5LmxzJE1PTSlbLCBjKG1lcmdlLnZhcnMsICJDIiwgIk4iKV0sIGJ5ID0gbWVyZ2UudmFycykgJT4lCiAgcmVuYW1lKENfbWluQyA9IEMsIE5fbWluQyA9IE4pCgojIGZpbGwgbWlzc2luZyBvUE9NIGRhdGEKc3JhLmZyYy5tc3Mud2lkZS5maWxsLmRmIDwtIHNyYS5mcmMubXNzLmxzcy5kZgpzcmEuZnJjLm1zcy53aWRlLmZpbGwuZGYkb1BPTSA8LSBpZmVsc2UoCiAgaXMubmEoc3JhLmZyYy5tc3Mud2lkZS5kZiRPUE9NKSwKICBzcmEuZnJjLm1zcy53aWRlLmRmJHd0X2cgLSAoc3JhLmZyYy5tc3Mud2lkZS5kZiRGUE9NICsgc3JhLmZyYy5tc3Mud2lkZS5kZiRNT00pLAogIHNyYS5mcmMubXNzLndpZGUuZGYkT1BPTSkKCiMgY2FsY3VsYXRlIG1hc3MgcHJlY2VudGFnZXMKc3JhLmZyYy5tc3Mud2lkZS5maWxsLmRmIDwtIHNyYS5mcmMubXNzLndpZGUuZmlsbC5kZiAlPiUKICBtdXRhdGUoZlBPTV9tYXNzX2ZyYWMgPSBGUE9NIC8gd3RfZywKICAgICAgICAgb1BPTV9tYXNzX2ZyYWMgPSBPUE9NIC8gd3RfZywKICAgICAgICAgbWluQ19tYXNzX2ZyYWMgPSBNT00gLyB3dF9nLAogICAgICAgICBQTWVjbyA9IHBhc3RlMChQTSwgRUNPKSkKCiMgIyBtb2RlbAojIHN1bW1hcnkobG0oZlBPTV9tYXNzX2ZyYWMgfiBQTSArIEVDTywgCiMgICAgICAgICAgICBzcmEuZnJjLm1zcy53aWRlLmZpbGwuZGZbc3JhLmZyYy5tc3Mud2lkZS5maWxsLmRmJGx5cl9ib3QgPT0gMTAgJiBzcmEuZnJjLm1zcy53aWRlLmZpbGwuZGYkeWVhciA9PSAyMDE5LF0pKQojIHN1bW1hcnkobG0ob1BPTV9tYXNzX2ZyYWMgfiBQTSArIEVDTywgCiMgICAgICAgICAgICBzcmEuZnJjLm1zcy53aWRlLmZpbGwuZGZbc3JhLmZyYy5tc3Mud2lkZS5maWxsLmRmJGx5cl9ib3QgPT0gMTAgJiBzcmEuZnJjLm1zcy53aWRlLmZpbGwuZGYkeWVhciA9PSAyMDE5LF0pKQojIHN1bW1hcnkobG0obWluQ19tYXNzX2ZyYWMgfiBQTSArIEVDTywgCiMgICAgICAgICAgICBzcmEuZnJjLm1zcy53aWRlLmZpbGwuZGZbc3JhLmZyYy5tc3Mud2lkZS5maWxsLmRmJGx5cl9ib3QgPT0gMTAgJiBzcmEuZnJjLm1zcy53aWRlLmZpbGwuZGYkeWVhciA9PSAyMDE5LF0pKQoKIyBwbG90CnNyYS5mcmMubXNzLmZpbGwucGxvdC5kZiA8LSBzcmEuZnJjLm1zcy53aWRlLmZpbGwuZGYgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjb250YWlucygibWFzc19mcmFjIiksIG5hbWVzX3RvID0gIkZyYWN0aW9uIiwgdmFsdWVzX3RvID0gIk1hc3MgcGVyY2VudCIpICU+JQogIG11dGF0ZShGcmFjdGlvbiA9IGZhY3RvcihGcmFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiZlBPTV9tYXNzX2ZyYWMiLCAib1BPTV9tYXNzX2ZyYWMiLCAibWluQ19tYXNzX2ZyYWMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiZlBPTV9tYXNzX2ZyYWMiID0gImZQT00iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvUE9NX21hc3NfZnJhYyIgPSAib1BPTSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaW5DX21hc3NfZnJhYyIgPSAibWluQyIpKSkKCiMgMjAxOQpzcmEuZnJjLm1zcy5maWxsLnBsb3QuZGYgJT4lCiAgZmlsdGVyKHllYXIgPT0gMjAxOSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhQTWVjbywgYE1hc3MgcGVyY2VudGAsIGZpbGwgPSBGcmFjdGlvbikpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAxLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX2NvbCgpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGRlcHRoKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCgojIDIwMDEgdG9vIGhhcmQgdG8gcGxvdCB3aXRoIGFsbCBkZXB0aHMKc3JhLmZyYy5tc3MuZmlsbC5wbG90LmRmICU+JQogIGZpbHRlcih5ZWFyID09IDIwMDEpICU+JQogIGdyb3VwX2J5KFBNZWNvLCBGcmFjdGlvbikgJT4lCiAgc3VtbWFyaXplKGBNYXNzIHBlcmNlbnRgID0gbWVhbihgTWFzcyBwZXJjZW50YCkpICU+JQogIGdncGxvdCguLCBhZXMoUE1lY28sIGBNYXNzIHBlcmNlbnRgLCBmaWxsID0gRnJhY3Rpb24pKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMSwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgbWVyZ2Ugdy8gZnJjIGxpc3RzCnNyYS5mcmMuc29jLjIwMDEubHMgPC0gbGFwcGx5KGxhcHBseShzcmEuZnJjLjIwMDEubHMsIGJpbmRfcm93cyksIGZ1bmN0aW9uKGRmKSB7CiAgbWVyZ2UoZGYsIAogICAgICAgIHNvYy4yMDAxLnN1bS5kZiAlPiUKICAgICAgICAgIG11dGF0ZShQTSA9IHN1YnN0cihQTWVjbywgMSwgMiksCiAgICAgICAgICAgICAgICAgRUNPID0gc3Vic3RyKFBNZWNvLCAzLCA0KSkgJT4lCiAgICAgICAgICBzZWxlY3QoUE0sIEVDTywgbHlyX2JvdCwgbHlyX3RvcCwgY19wY3RfbWVhbiwgbHlyX3NvY19rZ20yX21lYW4pICU+JQogICAgICAgICAgcmVuYW1lKGNfcGN0X2x5ciA9IGNfcGN0X21lYW4sCiAgICAgICAgICAgICAgICAgbHlyX3NvYyA9IGx5cl9zb2Nfa2dtMl9tZWFuKSwgCiAgICAgICAgYnkgPSBjKCJQTSIsICJFQ08iLCAibHlyX2JvdCIsICJseXJfdG9wIikpICU+JQogICAgc2VsZWN0KC0iSUQiKSAlPiUKICAgIG11dGF0ZSh5ZWFyID0gMjAwMSkKfSkKc3JhLmZyYy5zb2MuMjAxOS5scyA8LSBsYXBwbHkobGFwcGx5KHNyYS5mcmMuMjAxOS5scywgYmluZF9yb3dzKSwgZnVuY3Rpb24oZGYpIHsKICBtZXJnZShkZiwgc3JhLnNvYy4yMDE5LmRmLCBieSA9IGMoIlBNIiwgIkVDTyIsICJseXJfYm90IikpICU+JQogICAgc2VsZWN0KC1jKCJJRCIpKQp9KQoKIyBtZXJnZSAwMSwgMTkKc3JhLmZyYy5zb2MuMDEuMTkubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuZnJjLnNvYy4yMDE5LmxzKSwgZnVuY3Rpb24oaSkgewogIHJiaW5kKHNyYS5mcmMuc29jLjIwMTkubHNbW2ldXSwgc3JhLmZyYy5zb2MuMjAwMS5sc1tbaV1dKQp9KQpuYW1lcyhzcmEuZnJjLnNvYy4wMS4xOS5scykgPC0gbmFtZXMoc3JhLmZyYy5zb2MuMjAxOS5scykKCiMgbWVyZ2UgbWFzcyBmcmMKc3JhLmZyYy5tc3MuZmlsbC5sb25nLmxzIDwtIHNwbGl0KHNyYS5mcmMubXNzLmZpbGwucGxvdC5kZiwgc3JhLmZyYy5tc3MuZmlsbC5wbG90LmRmJEZyYWN0aW9uKQpzcmEuZnJjLm1zcy5maWxsLmxvbmcubHMgPC0gbGFwcGx5KHNyYS5mcmMubXNzLmZpbGwubG9uZy5scywgZnVuY3Rpb24oZGYpIHsKICBkZlsgLCBjKCJQTSIsICJFQ08iLCAieWVhciIsICJseXJfYm90IiwgIk1hc3MgcGVyY2VudCIpXQp9KQpzcmEuZnJjLnNvYy5scyA8LSBtYXBwbHkoCiAgbWVyZ2UsCiAgc3JhLmZyYy5zb2MuMDEuMTkubHMsCiAgc3JhLmZyYy5tc3MuZmlsbC5sb25nLmxzLAogIFNJTVBMSUZZID0gRkFMU0UpCgojIENhbGN1bGF0ZSBDIHBjdCBvZiBsYXllciwgYWJzb2x1dGUgQywgc3RvY2sgcGVyIGZyYWN0aW9uCnNyYS5mcmMuc29jLmRmIDwtIGJpbmRfcm93cyhzcmEuZnJjLnNvYy5scywgLmlkID0gIkZyYWN0aW9uIikKc3JhLmZyYy5zb2MuZGYkZnJjX0NfbHlyIDwtIChzcmEuZnJjLnNvYy5kZiRDICogc3JhLmZyYy5zb2MuZGYkYE1hc3MgcGVyY2VudGApIC8KICAgIHNyYS5mcmMuc29jLmRmJGNfcGN0X2x5cgpzcmEuZnJjLnNvYy53aWRlLmRmIDwtIHBpdm90X3dpZGVyKAogIHNyYS5mcmMuc29jLmRmLCAKICBpZF9jb2xzID0gYygieWVhciIsICJQTSIsICJFQ08iLCAibHlyX2JvdCIsICJseXJfc29jIiwgImNfcGN0X2x5ciIsKSwgCiAgbmFtZXNfZnJvbSA9IGMoIkZyYWN0aW9uIiksIHZhbHVlc19mcm9tID0gYygiQyIsICJNYXNzIHBlcmNlbnQiLCAiZnJjX0NfbHlyIikpICU+JQogIG1lcmdlKC4sIHNyYS5mcmMubXNzLndpZGUuZmlsbC5kZlsgLCBjKCJQTSIsICJFQ08iLCAibHlyX2JvdCIsICJ5ZWFyIiwgInd0X2ciKV0pCgojIHN1bSBnQyBmcmMKc3JhLmZyYy5zb2Mud2lkZS5kZiRjX3BjdF9seXJfZnJjIDwtIHJvd1N1bXMoc3JhLmZyYy5zb2Mud2lkZS5kZlssIGMoImZyY19DX2x5cl9GUE9NIiwgImZyY19DX2x5cl9PUE9NIiwgImZyY19DX2x5cl9NT00iKV0pICogMTAwCnNyYS5mcmMuc29jLndpZGUuZGYkQ19kaWZmIDwtIHNyYS5mcmMuc29jLndpZGUuZGYkY19wY3RfbHlyX2ZyYyAtIDEwMApgYGAKCmBgYHtyIHBsb3QtYy1sb3NzfQojIDIwMDEKIyBzcmEuZnJjLnNvYy53aWRlLmRmICU+JQojICAgZmlsdGVyKHllYXIgPT0gMjAwMSkgJT4lCiMgICBtdXRhdGUoUE1lY28gPSBwYXN0ZTAoUE0sIEVDTykpICU+JQojICAgZ2dwbG90KC4sIGFlcyhQTWVjbywgc29jX2xvc3QpKSArCiMgICBnZW9tX2NvbCgpICsKIyAgIGZhY2V0X2dyaWQocm93cyA9IHZhcnMobHlyX2JvdCkpICsKIyAgIHRoZW1lX2J3KCkgKwojICAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgMjAxOQpzcmEuZnJjLnNvYy53aWRlLmRmICU+JQogIGZpbHRlcih5ZWFyID09IDIwMTkpICU+JQogIG11dGF0ZShTaXRlID0gZmFjdG9yKHBhc3RlMChQTSwgRUNPKSwgCiAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiQU5wcCIsICJBTndmIiwgIkFOcmYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCU3BwIiwgIkJTd2YiLCAiQlNyZiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdScHAiLCAiR1J3ZiIsICJHUnJmIikpLAogICAgICAgICBgQyBkaWYuICglIG9mIHRvdGFsIHN0b2NrKWAgPSBDX2RpZmYpICU+JQogIGdncGxvdCguLCBhZXMoU2l0ZSwgYEMgZGlmLiAoJSBvZiB0b3RhbCBzdG9jaylgKSkgKwogIGdlb21fY29sKCkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMobHlyX2JvdCkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCiMjIEZyYWN0aW9uIDE0QwojIyMgRGVwdGggcHJvZmlsZXMKCmBgYHtyIHNoYXBlLWRlbnMxNEMtZGZ9CiMgZnVuY3Rpb24gZm9yIHNwbGl0dGluZyBzYW1wbGUgbmFtZXMgYW5kIGV4dHJhY3RpbmcgdmFsdWVzIGZyb20gYW1zIGxpc3QKdVNjb3JlU3BsaXQuZnggPC0gZnVuY3Rpb24oZGYsIGl4KSBzYXBwbHkoc3Ryc3BsaXQoZGZbWyJQcm9iZSJdXSwgIl8iKSwgIltbIiwgaXgpCgojIGNyZWF0ZSBkZgpkZW5zLmRmIDwtIGJpbmRfcm93cygKICBsYXBwbHkoCiAgICBhbXNfcmVzdWx0c19sc1stZ3JlcCgidGhtbCIsIG5hbWVzKGFtc19yZXN1bHRzX2xzKSldLCBmdW5jdGlvbihscykgewogICAgICBkZi5leCA8LSBmdW5jdGlvbih4LCBmcmMpIHsKICAgICAgICBiaW5kX3Jvd3MobGFwcGx5KHgsIGZ1bmN0aW9uKGRmKSB7CiAgICAgICAgICBkZltncmVwKGZyYywgZGYkUHJvYmUpLCAyOjZdCiAgICAgICAgfSkpCiAgICAgIH0KICAgICAgZlBPTSA8LSBkZi5leChscywgIkZQT00iKQogICAgICBvUE9NIDwtIGRmLmV4KGxzLCAiT1BPTSIpCiAgICAgIG1pbkMgPC0gZGYuZXgobHMsICJNT00iKQogICAgICByZXR1cm4oCiAgICAgICAgY2JpbmQocmJpbmQoZlBPTSwgb1BPTSwgbWluQyksIGZyYyA9IGMocmVwKCJmUE9NIiwgbnJvdyhmUE9NKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwKCJvUE9NIiwgbnJvdyhvUE9NKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwKCJtaW5DIiwgbnJvdyhtaW5DKSkpKSkKICAgIH0pKSAlPiUKICBtdXRhdGUoUE1lY28gPSB1U2NvcmVTcGxpdC5meCguLCAyKSwKICAgICAgICAgUE0gPSBzdWJzdHIoUE1lY28sIDEsIDIpLAogICAgICAgICBFQ08gPSBmYWN0b3Ioc3Vic3RyKFBNZWNvLCAzLCA0KSwgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSksCiAgICAgICAgIFllYXIgPSB1U2NvcmVTcGxpdC5meCguLCA0KSwKICAgICAgICAgcHJvX25hbWUgPSBwYXN0ZTAoUE1lY28sICJfIiwgWWVhciksCiAgICAgICAgIGRlcHRocyA9IHVTY29yZVNwbGl0LmZ4KC4sIDUpLAogICAgICAgICBseXJfdG9wID0gYXMubnVtZXJpYyhzYXBwbHkoc3Ryc3BsaXQoZGVwdGhzLCAiLSIpLCAiW1siLCAxKSksCiAgICAgICAgIGx5cl9ib3QgPSBhcy5udW1lcmljKHNhcHBseShzdHJzcGxpdChkZXB0aHMsICItIiksICJbWyIsIDIpKSkgJT4lCiAgcmVuYW1lKGZyY18xNGMgPSAi4oiGMTRDLijigLApIiwKICAgICAgICAgZnJjXzE0Y19lcnIgPSAiZXJyLijigLApIikgJT4lCiAgc2VsZWN0KC1jKFByb2JlLCBkZXB0aHMpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGZyY18xNGMpKQoKIyBhZGQgJzA5IGRhdGEKZGVucy4wMS4wOS4xOS5kZiA8LSByYmluZChkZW5zLmRmLCBzcmEuZnJjLjE0YykgJT4lCiAgbXV0YXRlKHBtID0gaWZlbHNlKFBNID09ICJBTiIsICJhbmRlc2l0ZSIsIAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpLAogICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICB5ZWFyID0gYXMubnVtZXJpYyhZZWFyKSwKICAgICAgICAgbWlkZGVwdGggPSBseXJfdG9wICsgKGx5cl9ib3QgLSBseXJfdG9wKSAvIDIpCmBgYAoKYGBgIHtyIHBsb3QtcHJvZmlsZXN9CiMgcHJvIHBsb3QgZngKZGVucy5wcm8ucC5meCA8LSBmdW5jdGlvbihkZiwgeWVhciwgbGVnLnBvcyA9ICJyaWdodCIpIHsKICAKICAjIGZpbHRlciBkZiBieSB5ZWFyCiAgZGYgPC0gZGZbZGYkeWVhciA9PSB5ZWFyLCBdCiAgCiAgIyBnZXQgYXRtIDE0QwogIGF0bS4xNGMgPC0gYXRtLjE0Y1thdG0uMTRjJHllYXIgPT0geWVhciArIC41LCAiZDE0YyJdCiAgCiAgIyBzZXQgc2hhcGUgdG8gMjAwMSBkZWZhdWx0cwogIHNocC52IDwtIGMoIndhcm0iID0gMTUsICJjb29sIiA9IDE3LCAiY29sZCIgPSAxNikKICBhbGYgPC0gMQogIGxudC52IDwtIGMoIjIwMDEiID0gMSkKICBzdHJva2UgPC0gMQogIGxuLnN6IDwtIC41CiAgCiAgIyBjaGFuZ2Ugc2hhcGUgYW5kIGFscGhhIGFzIG5lZWRlZAogIGlmICh5ZWFyID09IDIwMDkpIHsKICAgIGFsZiA8LSAuNgogICAgbG50LnYgPC0gYygiMjAwOSIgPSAyKQogIH0gZWxzZSBpZiAoeWVhciA9PSAyMDE5KSB7CiAgICBzaHAudiA8LSBjKCJ3YXJtIiA9IDAsICJjb29sIiA9IDIsICJjb2xkIiA9IDEpCiAgICBsbnQudiA8LSBjKCIyMDE5IiA9IDMpCiAgICBzdHJva2UgPC0gMS4yCiAgICBsbi5zeiA8LSAxCiAgfQogIAogICMgcGxvdCBmeAogIGdncGxvdChkZiwgYWVzKGZyY18xNGMsIGx5cl9ib3QsIGNvbG9yID0gZnJjKSkgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYXRtLjE0YywgY29sb3IgPSAiZ3JheSIpICsKICAgIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gZWNvKSwgc2l6ZSA9IDMsIGFscGhhID0gYWxmLCBzdHJva2UgPSBzdHJva2UpICsKICAgIGdlb21fcGF0aChhZXMobGluZXR5cGUgPSBZZWFyKSwgc2l6ZSA9IGxuLnN6KSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygibWluQyIgPSAiIzliMDAzZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZlBPTSIgPSAiIzNmOWIwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib1BPTSIgPSAiIzAwNDdhZiIpKSArCiAgICBzY2FsZV9saW5ldHlwZV9tYW51YWwobmFtZSA9IE5VTEwsIHZhbHVlcyA9IGxudC52KSArCiAgICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9IE5VTEwsIHZhbHVlcyA9IHNocC52KSArCiAgICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKHBtKSkgKwogICAgc2NhbGVfeV9yZXZlcnNlKCkgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gbGVnLnBvcykKfQpgYGAKCmBgYHtyIHBsb3QtZGVucy1wcm9zfQojIHBsb3QgcHJvZmlsZXMgYnkgeWVhciBhbmQgZnJhY3Rpb24gdHlwZQpkZW5zLnByby5wLmZ4KGRlbnMuMDEuMDkuMTkuZGYsIDIwMDEpCmRlbnMucHJvLnAuZngoZGVucy4wMS4wOS4xOS5kZiwgMjAxOSkKZGVucy5wcm8ucC5meChkZW5zLjAxLjA5LjE5LmRmLCAyMDA5KQpgYGAKCiMjIFNwbGluZSAnMDEsICcwOQojIyMgU3BsaW5lIEMKCmBgYHtyIHNwbGluZS1jLWRhdGF9CiMgc3BsaW5lIGZpdCBmeHMgZm9yIGZyYWN0aW9uIFNPQyBzdG9ja3MKIyMgTWFzcyBwcmVzZXJ2aW5nIHNwbGluZSAocXVhZHJhdGljKQptcHNwbGluZS5mcmMuZnggPC0gZnVuY3Rpb24oZnJjLmRmKSB7CiAgCiAgIyBzcGxpdCBieSBmcmMgYW5kIFBNZWNvIHRvIGZpdCBzcGxpbmVzIHRvIHByb2ZpbGVzCiAgbGFwcGx5KAogICAgc3BsaXQoZnJjLmRmLCBmcmMuZGYkZnJjKSwgZnVuY3Rpb24oZGYpIHsKICAgICAgbGFwcGx5KHNwbGl0KGRmLCBkZiRQTWVjbyksIGZ1bmN0aW9uKHgpIHsKICAgICAgICAKICAgICAgICAjIGNoZWNrIGZvciBzaW5nbGUgb2JzIGRhdGEKICAgICAgICBpZiAobnJvdyh4KSA+IDEpIHsKICAgICAgICAgIAogICAgICAgICAgIyBtYWtlIHN1cmUgdG8gb3JkZXIgZGF0YQogICAgICAgICAgeCA8LSB4W29yZGVyKHgkbHlyX2JvdCksIF0gCiAgICAgICAgICAKICAgICAgICAgICMgY2FsY3VsYXRlIGN1bXVsYXRpdmUgQyBtYXNzCiAgICAgICAgICB4JG1hc3NfY19jbXR2IDwtIE5BCiAgICAgICAgICBmb3IoaSBpbiBzZXFfYWxvbmcoeCRseXJfYm90KSkgewogICAgICAgICAgICBpZihpID09IDEpIHsKICAgICAgICAgICAgICB4JG1hc3NfY19jbXR2W2ldIDwtIHgkbWFzc19jX2dbaV0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB4JG1hc3NfY19jbXR2W2ldIDwtIHgkbWFzc19jX2dbaV0gKyB4JG1hc3NfY19jbXR2W2ktMV0gCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgIyBjb252ZXJ0IHRvIHNvaWwgcHJvZmlsZSBjb2xsZWN0aW9uIG9iaiBhbmQgcnVuIG1wc3BsaW5lCiAgICAgICAgICBkZXB0aHMoeCkgPC0gUE1lY28gfiBseXJfdG9wICsgbHlyX2JvdAogICAgICAgICAgeC5tcHMgPC0gc3VwcHJlc3NNZXNzYWdlcygKICAgICAgICAgICAgbXBzcGxpbmUoeCwgdmFyLm5hbWUgPSAibWFzc19jX2NtdHYiLCBzaG93LnByb2dyZXNzID0gRkFMU0UpKQogICAgICAgICAgCiAgICAgICAgICAjIGV4dHJhY3QgMSBjbSBpbmNyZW1lbnQgZGF0YQogICAgICAgICAgaXggPC0gd2hpY2goIWlzLm5hKHgubXBzJHZhci4xY20pKQogICAgICAgICAgZGYgPC0gZGF0YS5mcmFtZShtaWRkZXB0aCA9IHNlcSgxLCBsZW5ndGgoaXgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbHlyX3NvYyA9IHgubXBzJHZhci4xY21baXhdKQogICAgICAgICAgCiAgICAgICAgICAjIGNoZWNrIGZvciBOQSB2YWx1ZXMgdXAgdG8gMzAgY20KICAgICAgICAgIGlmIChsZW5ndGgoaXgpIDwgMzEpIHsKICAgICAgICAgICAgIyBjb252ZXJ0IHRvIGNsYXNzICJzcGxpbmUiIHdpdGggc21vb3RoLnNwbGluZSBmeG4KICAgICAgICAgICAgc3Auc3MgPC0gc21vb3RoLnNwbGluZShkZikKICAgICAgICAgIAogICAgICAgICAgICAjIHByZWRpY3QgZm9yIE5BIHZhbHVlcyB1cCB0byAzMSBjbSAobGluZWFyIGJleW9uZCBsYXN0IG1lYXN1cmVkIGRlcHRoKQogICAgICAgICAgICBzdGQgPC0gc2VxKDAsIDMwKSAjIGluIGNtIAogICAgICAgICAgICBzcCA8LSBwcmVkaWN0KHNwLnNzLCBzdGQpIAogICAgICAgICAgICBkZiA8LSBkYXRhLmZyYW1lKHNwKQogICAgICAgICAgICBjb2xuYW1lcyhkZikgPC0gYygibWlkZGVwdGgiLCJseXJfc29jIikgCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgICMgcmV0dXJuCiAgICAgICAgICByZXR1cm4oZGYpCiAgICAgICAgfQogICAgICB9KQogICAgfSkKfQoKIyMgZGVwdGggc3BsaW5lIGFsdGVybmF0aXZlIChsaW5lYXIgZm9yIHR3byBpbmNyZW1lbnQgZml0cy4uLikKU09Dc3BsaW5lLmZ4IDwtIGZ1bmN0aW9uKGZyYy5kZikgewogIAogICMgc3BsaXQgYnkgZnJjIGFuZCBQTWVjbyB0byBmaXQgc3BsaW5lcyB0byBwcm9maWxlcwogIGxhcHBseSgKICAgIHNwbGl0KGZyYy5kZiwgZnJjLmRmJGZyYyksIGZ1bmN0aW9uKGRmKSB7CiAgICAgIGxhcHBseShzcGxpdChkZiwgZGYkUE1lY28pLCBmdW5jdGlvbih4KSB7CiAgICAKICAgICAgICAjIGNoZWNrIGZvciBzaW5nbGUgb2JzIGRhdGEKICAgICAgICBpZiAobnJvdyh4KSA+IDEpIHsKICAgICAgICAgIAogICAgICAgICAgIyBtYWtlIHN1cmUgdG8gb3JkZXIgZGF0YQogICAgICAgICAgeCA8LSB4W29yZGVyKHgkbHlyX2JvdCksIF0gCiAgICAgICAgICAKICAgICAgICAgICMgY2FsY3VsYXRlIGN1bXVsYXRpdmUgQyBtYXNzCiAgICAgICAgICB4JG1hc3NfY19jbXR2IDwtIE5BCiAgICAgICAgICBmb3IoaSBpbiBzZXFfYWxvbmcoeCRseXJfYm90KSkgewogICAgICAgICAgICBpZihpID09IDEpIHsKICAgICAgICAgICAgICB4JG1hc3NfY19jbXR2W2ldIDwtIHgkbWFzc19jX2dbaV0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB4JG1hc3NfY19jbXR2W2ldIDwtIHgkbWFzc19jX2dbaV0gKyB4JG1hc3NfY19jbXR2W2ktMV0gCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgIyBmaXQgbW9ub3RvbmljIGN1YmljIHNwbGluZQogICAgICAgICAgc3AgPC0gc3BsaW5lKHhbICwgYygibWlkZGVwdGgiLCAibWFzc19jX2NtdHYiKV0sIG1ldGhvZCA9ICJoeW1hbiIpIAogICAgICAgICAgCiAgICAgICAgICAjIGNvbnZlcnQgdG8gY2xhc3MgInNwbGluZSIgd2l0aCBzbW9vdGguc3BsaW5lIGZ4bgogICAgICAgICAgc3Auc3MgPC0gc21vb3RoLnNwbGluZShzcCkgCiAgICAgICAgICAKICAgICAgICAgICMgcHJlZGljdCAxIGNtIGluY3JlbWVudHMgdG8gMzAgY20gKGxpbmVhciBiZXlvbmQgbGFzdCBtZWFzdXJlZCBkZXB0aCkKICAgICAgICAgIHN0ZCA8LSBzZXEoMCwgMzApICMgaW4gY20gCiAgICAgICAgICBzcCA8LSBwcmVkaWN0KHNwLnNzLCBzdGQpIAogICAgICAgICAgZGYgPC0gZGF0YS5mcmFtZShzcCkKICAgICAgICAgIGNvbG5hbWVzKGRmKSA8LSBjKCJtaWRkZXB0aCIsImx5cl9zb2MiKSAKICAgICAgICAgIAogICAgICAgICAgIyByZXR1cm4gCiAgICAgICAgICByZXR1cm4oZGYpCiAgICAgICAgfQogICAgICB9KQogICAgfSkKfQpgYGAKCmBgYHtyIHJ1bi1jc3BsaW5lLWZyY30KIyBmcmFjdGlvbiBDIHN0b2NrcwojIHNvYy4yMDA5LmZyY1NPQy5zcCA8LSBtcHNwbGluZS5mcmMuZngoc3JhLmZyYy5tc3MuQy4wOS5kZikKc29jLjIwMDEuZnJjU09DLnNwIDwtIG1wc3BsaW5lLmZyYy5meChzcmEuZnJjLm1zcy5DLjAxLmRmKQpzb2MuMjAwMS5mcmNTT0Muc3AuZGYgPC0gbGFwcGx5KHNvYy4yMDAxLmZyY1NPQy5zcCwgZnVuY3Rpb24obHMpCiAgbGFwcGx5KGxzLCBmdW5jdGlvbihkZikgewogICAgIyBzdW1tYXJpemUgZm9yIHRhcmdldCBpbnRlcnZhbHMKICAgICAgICBkZiA8LSBkYXRhLmZyYW1lKAogICAgICAgICAgbHlyX2JvdCA9IGMoMTAsIDIwLCAzMCksCiAgICAgICAgICBseXJfc29jX2NtdHYgPSBjKGRmWzEwLCAibHlyX3NvYyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZlsyMCwgImx5cl9zb2MiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZbMzAsICJseXJfc29jIl0pKQogICAgICAgIGRmJGx5cl9zb2MgPC0gTkEKICAgICAgICBmb3IgKGkgaW4gc2VxX2Fsb25nKGRmJGx5cl9ib3QpKSB7CiAgICAgICAgICBpZihpID09IDEpIHsKICAgICAgICAgICAgICBkZiRseXJfc29jW2ldIDwtIGRmJGx5cl9zb2NfY210dltpXQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGRmJGx5cl9zb2NbaV0gPC0gZGYkbHlyX3NvY19jbXR2W2ldIC0gZGYkbHlyX3NvY19jbXR2W2kgLSAxXSAKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4oZGZbICwgYygibHlyX2JvdCIsICJseXJfc29jIildKQogIH0pKQoKdGVzdCA8LSBzcmEuZnJjLm1zcy5DLjAxLmRmICU+JSAKICBTT0NzcGxpbmUuZngKCiMgTWVhc3VyZWQgU09DIGFzIGxzCnNyYS5mcmMubXNzLkMuMDEubHMgPC0gbGFwcGx5KAogIHNwbGl0KHNyYS5mcmMubXNzLkMuMDEuZGYsIHNyYS5mcmMubXNzLkMuMDEuZGYkZnJjKSwgZnVuY3Rpb24oZGYpCiAgICBzcGxpdChkZiwgZGYkUE1lY28pKQoKIyBtYWtlIHNwbGluZSBsaXN0cyBzaW1pbGFyIGZvciBwbG90dGluZyB0b2dldGhlcgpmcmMucG1lY28uZnggPC0gZnVuY3Rpb24oc29jX2xzLCBuYW1lKSB7CiAgICBsYXBwbHkoc2VxX2Fsb25nKHNvY19scyksIGZ1bmN0aW9uKGopCiAgICAgIGxhcHBseShzZXFfYWxvbmcoc29jX2xzW1tqXV0pLCBmdW5jdGlvbihpKSB7CiAgICAgICAgUE1lY28gPC0gbmFtZXMoc29jX2xzW1tqXV0pW2ldCiAgICAgICAgaWYgKCFpcy5kYXRhLmZyYW1lKHNvY19sc1tbal1dW1tpXV0pKSB7CiAgICAgICAgICBseXJfc29jIDwtIHNvY19sc1tbal1dW1tpXV0KICAgICAgICAgIGRmIDwtIGRhdGEuZnJhbWUobWlkZGVwdGggPSBzZXEoMSwgbGVuZ3RoKGx5cl9zb2MpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbHlyX3NvYyA9IGx5cl9zb2MpCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRmIDwtIHNvY19sc1tbal1dW1tpXV0KICAgICAgICB9CiAgICAgICAgIyBhZGQgbmFtZSBhbmQgcmV0dXJuCiAgICAgICAgZGYgJT4lCiAgICAgICAgICBtdXRhdGUoaWQgPSBuYW1lLAogICAgICAgICAgICAgICAgIFBNZWNvID0gUE1lY28sCiAgICAgICAgICAgICAgICAgZnJjID0gbmFtZXMoc29jX2xzKVtqXSkKICAgICAgfSkpCiAgfQogIAojIHJ1biBmeApsczEgPC0gZnJjLnBtZWNvLmZ4KHRlc3QsICJzcCIpCmxzMiA8LSBmcmMucG1lY28uZngoc29jLjIwMDEuZnJjU09DLnNwLCAibXBzcGxpbmUiKQogIAojIGNvbWJpbmUgbGlzdHMKbHMxMiA8LSBsYXBwbHkoc2VxX2Fsb25nKGxzMSksIGZ1bmN0aW9uKGkpCiAgYmluZF9yb3dzKAogICAgbGFwcGx5KHNlcV9hbG9uZyhsczFbW2ldXSksIGZ1bmN0aW9uKGopCiAgICAgIHJiaW5kKGxzMVtbaV1dW1tqXV0sIGxzMltbaV1dW1tqXV0pCiAgICAgICksIC5pZCA9ICJQTWVjbyIpICU+JQogICAgbXV0YXRlKFBNZWNvID0gZmFjdG9yKFBNZWNvLCBsYWJlbHMgPSB1bmlxdWUoc3JhLmZyYy5tc3MuQy4wMS5kZiRQTWVjbykpKSkKCiMgY2FsY3VsYXRlIGN1bXVsYXRpdmUgQyBtYXNzCnNyYS5mcmMubXNzLkMuMDEubHMyIDwtIGxhcHBseShzcmEuZnJjLm1zcy5DLjAxLmxzLCBmdW5jdGlvbihscykgewogIGxhcHBseShscywgZnVuY3Rpb24oZGYpIHsKICAgIGRmJG1hc3NfY19jbXR2IDwtIE5BCiAgICBmb3IoaSBpbiBzZXFfYWxvbmcoZGYkbHlyX2JvdCkpIHsKICAgICAgaWYoaSA9PSAxKSB7CiAgICAgICAgZGYkbWFzc19jX2NtdHZbaV0gPC0gZGYkbWFzc19jX2dbaV0KICAgICAgfSBlbHNlIHsKICAgICAgICBkZiRtYXNzX2NfY210dltpXSA8LSBkZiRtYXNzX2NfZ1tpXSArIGRmJG1hc3NfY19jbXR2W2kgLSAxXSAKICAgICAgfQogICAgfQogICAgcmV0dXJuKGRmKQogIH0pCn0pCgojIGFkZCBhZGRpdGlvbmFsIDAgbWVhc3VyZW1lbnQgZm9yIHN0ZXAgcGxvdApzcmEuZnJjLm1zcy5DLjAxLmxzMyA8LSBsYXBwbHkoc3JhLmZyYy5tc3MuQy4wMS5sczIsIGZ1bmN0aW9uKGxzKQogIGJpbmRfcm93cyhsYXBwbHkobHMsIGZ1bmN0aW9uKGRmKSB7CiAgICB4IDwtIGRmW3doaWNoKGRmJGx5cl9ib3QgPT0gbWluKGRmJGx5cl9ib3QpKSwgXQogICAgeCRseXJfYm90IDwtIDAKICAgIHJiaW5kKHgsIGRmKQogIH0pKQopCgojIGJpbmQgcm93cyBvZiBzdWJsaXN0CnNyYS5mcmMubXNzLkMuMDEubHM0IDwtIGxhcHBseShzcmEuZnJjLm1zcy5DLjAxLmxzMiwgZnVuY3Rpb24obHMpIGJpbmRfcm93cyhscykpCgojIGFkZCBtZWFzdXJlZCBkYXRhIHRvIGRmMTIgYW5kIHBsb3QKcC5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKGxzMTIpLCBmdW5jdGlvbihpKSB7CiAgZnJjIDwtIGxzMTJbW2ldXVtbImZyYyJdXQogIGxzMTJbW2ldXSAlPiUKICAgIG11dGF0ZShQTSA9IHN1YnN0cihQTWVjbywgMSwgMiksCiAgICAgICAgICAgRUNPID0gc3Vic3RyKFBNZWNvLCAzLCA0KSkgJT4lCiAgICBnZ3Bsb3QoLiwgYWVzKGx5cl9zb2MsIG1pZGRlcHRoLCBjb2xvciA9IFBNKSkgKwogICAgZ2VvbV9zdGVwKGRhdGEgPSBzcmEuZnJjLm1zcy5DLjAxLmxzM1tbaV1dLAogICAgICAgICAgICAgIGFlcyhtYXNzX2NfY210diwgbHlyX2JvdCkpICsKICAgIGdlb21fcGF0aChhZXMobGluZXR5cGUgPSBpZCkpICsKICAgIGdlb21fcG9pbnQoZGF0YSA9IHNyYS5mcmMubXNzLkMuMDEubHM0W1tpXV0sCiAgICAgICAgICAgICAgIGFlcyhtYXNzX2NfY210diwgbWlkZGVwdGgpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiQU4iID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gYmFzYWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9IGdyYW5pdGUpKSArICAgICAgCiAgICBzY2FsZV95X3JldmVyc2UoKSArCiAgICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKFBNKSwgcm93cyA9IHZhcnMoRUNPKSkgKwogICAgZ2d0aXRsZShmcmMpICsKICAgIHRoZW1lX2J3KCkgKwogICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKfSkKCiMgcGxvdApwLmxzCmBgYAoKYGBge3IgY29tYmluZS1mcG9tLW9wb219CiMgY29tYmluZSBmUE9NIGFuZCBvUE9NIGZvciAiUE9NIiBmcmFjdGlvbgpzb2MuMjAwMS5QT00uc3AuZGYgPC0gYmluZF9yb3dzKG1hcHBseSgKICBtZXJnZSwKICBzb2MuMjAwMS5mcmNTT0Muc3AuZGYkRlBPTSwKICBzb2MuMjAwMS5mcmNTT0Muc3AuZGYkT1BPTSwKICBNb3JlQXJncyA9IGxpc3QoYnkgPSAibHlyX2JvdCIsIHN1ZmZpeGVzID0gYygiX2ZQT00iLCAiX29QT00iKSksCiAgU0lNUExJRlkgPSBGQUxTRSksIC5pZCA9ICJQTWVjbyIpCnNvYy4yMDAxLlBPTS5zcC5kZiRzb2NfUE9NIDwtIHJvd1N1bXMoCiAgc29jLjIwMDEuUE9NLnNwLmRmWyAsIGMoImx5cl9zb2NfZlBPTSIsICJseXJfc29jX29QT00iKV0pCnBvbS5jLjAxLmRmIDwtIHBpdm90X2xvbmdlcigKICBzb2MuMjAwMS5QT00uc3AuZGYsIAogIGNvbHMgPSBzdGFydHNfd2l0aCgibHlyX3NvYyIpLAogIG5hbWVzX3RvID0gImZyYyIsCiAgbmFtZXNfcHJlZml4ID0gImx5cl9zb2NfIiwKICB2YWx1ZXNfdG8gPSAic29jX2ZyYyIpCnBvbS5jLjAxLmRmJGNfUE9NX2ZyYyA8LSBwb20uYy4wMS5kZiRzb2NfZnJjIC8gcG9tLmMuMDEuZGYkc29jX1BPTQpgYGAKCiMjIyBTcGxpbmUgMTRDCgpgYGB7ciBzcGxpbmUtMTRDLWZyY30KIyBydW4gbXBzcGxpbmUgb24gZnJhY3Rpb24gbW9kZXJuIGRhdGEgZm9yICcwMSwgJzA5CmRlbnMuMDEuMDkuZGYgPC0gZGVucy4wMS4wOS4xOS5kZlt3aGljaChkZW5zLjAxLjA5LjE5LmRmJHllYXIgIT0gMjAxOSksIF0KZGVucy4wMS4wOS5kZiRmcmMgPC0gZmFjdG9yKGRlbnMuMDEuMDkuZGYkZnJjLCBsZXZlbHMgPSBjKCJmUE9NIiwgIm9QT00iLCAibWluQyIpKQpkZW5zLjAxLjA5LmxzLnNwIDwtIGxhcHBseSgKICBzcGxpdChkZW5zLjAxLjA5LmRmLCBkZW5zLjAxLjA5LmRmJGZyYyksIGZ1bmN0aW9uKGRmKSB7CiAgICBsYXBwbHkoc3BsaXQoZGYsIGRmJHByb19uYW1lKSwgZnVuY3Rpb24oeCkgewogICAgICBpZiAobGVuZ3RoKHdoaWNoKCFpcy5uYSh4JEYxNEMpKSkgPiAxKSB7CiAgICAgICBkZXB0aHMoeCkgPC0gcHJvX25hbWUgfiBseXJfdG9wICsgbHlyX2JvdAogICAgICAgIHgubXBzIDwtIHN1cHByZXNzTWVzc2FnZXMoCiAgICAgICAgICBtcHNwbGluZSh4LCB2YXIubmFtZSA9ICJGMTRDIiwgc2hvdy5wcm9ncmVzcyA9IEZBTFNFKSkKICAgICAgICB4Lm1wcyR2YXIuMWNtIDwtIHgubXBzJHZhci4xY21bMTozMF0KICAgICAgICAKICAgICAgICAjIGZpbGwgTkEgdy8gc21vb3RoLnNwbGluZSBwcmVkaWN0aW9uIChsaW5lYXIpCiAgICAgICAgaXggPC0gd2hpY2goaXMubmEoeC5tcHMkdmFyLjFjbSkpCiAgICAgICAgaWYgKGxlbmd0aChpeCkgPiAwKSB7CiAgICAgICAgICBzcC5zcyA8LSBzbW9vdGguc3BsaW5lKHgubXBzJHZhci4xY21bLWl4XSkKICAgICAgICAgIHNwIDwtIHByZWRpY3Qoc3Auc3MsIGl4KQogICAgICAgICAgeC5tcHMkdmFyLjFjbVtpeF0gPC0gc3AkeQogICAgICAgIH0KICAgICAgICByZXR1cm4oeC5tcHMpIAogICAgICB9CiAgICB9KQogIH0pCmBgYAoKYGBge3IgcGxvdC1mcmMtZm0tc3BsaW5lc30KIyBwbG90IGZvciBkZXRlcm1pbmluZyBiZXN0IGV4dHJhcG9sYXRpb24gZngKZnJjLmZtLnNwLnBsb3QuZnggPC0gZnVuY3Rpb24oZm0uc3AubHMpIHsKICBsYXBwbHkoZm0uc3AubHMsIGZ1bmN0aW9uKGxzKSB7CiAgICBwIDwtIGJpbmRfcm93cyhsYXBwbHkoc2VxX2Fsb25nKGxzKSwgZnVuY3Rpb24oaSkgewogICAgICBpZiAoIWlzLm51bGwobHNbW2ldXSkpIHsKICAgICAgICBkZiA8LSBkYXRhLmZyYW1lKHQoZG8uY2FsbChyYmluZCwgbGlzdChsc1tbaV1dW1sxXV0sIGxzW1tpXV1bWzRdXSkpKSkKICAgICAgICBkZiRtaWRkZXB0aCA8LSBzZXEoMSwgbGVuZ3RoKGRmWyAsIDFdKSkKICAgICAgICBkZiRQTSA8LSBzdWJzdHIoZGZbICwgMV0sIDEsIDIpCiAgICAgICAgZGYkRUNPIDwtIHN1YnN0cihkZlsgLCAxXSwgMywgNCkKICAgICAgICBkZiRZZWFyIDwtIGlmZWxzZShzdWJzdHIoZGZbICwgMV0sIDYsIDkpID09ICIyMDEwIiwgIjIwMDkiLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0cihkZlsgLCAxXSwgNiwgOSkpCiAgICAgICAgY29sbmFtZXMoZGYpWzJdIDwtICJmbSIKICAgICAgICBkZiRmbSA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihkZiRmbSkpCiAgICAgICAgcmV0dXJuKGRmWyAsIC0xXSkKICAgICAgfQogICAgfSkpICU+JQogICAgZ2dwbG90KC4sIGFlcyhmbSwgbWlkZGVwdGgsIGNvbG9yID0gUE0sIGxpbmV0eXBlID0gWWVhcikpICsKICAgIGdlb21fcGF0aCgpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJBTiIgPSBhbmRlc2l0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSBiYXNhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gZ3Jhbml0ZSkpICsKICAgIHNjYWxlX2xpbmV0eXBlX21hbnVhbChuYW1lID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCIyMDAxIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwOSIgPSAyKSkgKwogICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLjc1LCAxLjI1KSkgKwogICAgc2NhbGVfeV9yZXZlcnNlKCkgKwogICAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhFQ08pLCBjb2xzID0gdmFycyhQTSkpICsKICAgIHRoZW1lX2J3KCkgKwogICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKICB9KQp9CmRlbnMuMDEuMDkubHMuc3AucCA8LSBmcmMuZm0uc3AucGxvdC5meChkZW5zLjAxLjA5LmxzLnNwKQpgYGAKCiMjIyBDLXdlaWdodGVkIDE0QyBzcGxpbmUKCmBgYHtyIGN3dC0xNGN9CiMgZnJhY3Rpb25zCmN3dC5mcmMuZnggPC0gZnVuY3Rpb24oc29jLmxzKSB7CiAgbGFwcGx5KHNvYy5scywgZnVuY3Rpb24ocHJvX2xzKSB7CiAgICBsYXBwbHkocHJvX2xzLCBmdW5jdGlvbihzb2MpIHsKICAgICAgZCA8LSBzZXEoMTAsIDMwLCAxMCkKICAgICAgYyA8LSB2ZWN0b3IobW9kZSA9ICJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKGQpKQogICAgICBmb3IoaiBpbiBzZXFfYWxvbmcoZCkpIHsKICAgICAgICBpZihqID09IDEpIHsKICAgICAgICAgICMgZmlyc3QgZGVwdGggaW5jcmVtZW50CiAgICAgICAgICBjW1tqXV0gPC0gc29jWzE6ZFtqXSwgImx5cl9zb2MiXQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAjIGZvbGxvd2luZyBkZXB0aCBpbmNyZW1lbnRzCiAgICAgICAgICBjW1tqXV0gPC0gc29jWyhkW2otMV0rMSk6ZFtqXSwgImx5cl9zb2MiXSAKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuKHVubGlzdChsYXBwbHkoYywgZnVuY3Rpb24oeCkgeCAvIHN1bSh4LCBuYS5ybSA9IFRSVUUpKSkpCiAgICB9KQogIH0pCn0KCiMgMjAwMQpjd3QuMTkuMDEuZnJjIDwtIGN3dC5mcmMuZngoc29jLjIwMDEuZnJjU09DLnNwKQoKIyAyMDA5CiMgY3d0LjE5LjA5IDwtIGN3dC5mcmMuZngoc29jLjIwMDkuZnJjU09DLnNwKQoKIyMgY2FsY3VsYXRlIGZtX3d0cwojIyAnMTkgZGVwdGhzCiMgMjAwMQpmbS53dGQuMTkuMDEgPC0gbGFwcGx5KHNlcV9hbG9uZyhkZW5zLjAxLjA5LmxzLnNwKSwgZnVuY3Rpb24oaSkgewogIAogICMgcnVuIGZ4IG9uIG5vbi1udWxsIGVsZW1lbnRzCiAgZm0ubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhjd3QuMTkuMDEuZnJjW1tpXV0pLCBmdW5jdGlvbihqKSB7CiAgICAgIAogICAgICBpZiAoIWlzLm51bGwoZGVucy4wMS4wOS5scy5zcFtbaV1dW1tqXV0pKSB7CiAgICAgICAgIyBjYmluZCBjd3RzLCBmbQogICAgICAgIGRmIDwtIGRhdGEuZnJhbWUoY3d0ID0gY3d0LjE5LjAxLmZyY1tbaV1dW1tqXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICBmbSA9IGRlbnMuMDEuMDkubHMuc3BbW2ldXVtbal1dW1sidmFyLjFjbSJdXSkKICAgICAgCiAgICAgICAgIyBjYWxjdWxhdGUgd3RkIGZtCiAgICAgICAgZGYkZm1fd3QgPC0gZGYkZm0gKiBkZiRjd3QKICAgICAgICAKICAgICAgICAjIHN1bW1hcml6ZSBmb3IgdGFyZ2V0IGludGVydmFscwogICAgICAgIGRhdGEuZnJhbWUoCiAgICAgICAgICBseXJfYm90ID0gYygxMCwgMjAsIDMwKSwKICAgICAgICAgIGZtID0gYygKICAgICAgICAgICAgc3VtKGRmWzE6MTAsICJmbV93dCJdKSwgCiAgICAgICAgICAgIHN1bShkZlsxMToyMCwgImZtX3d0Il0pLCAKICAgICAgICAgICAgc3VtKGRmWzIxOjMwLCAiZm1fd3QiXSkpKSAKICAgICAgfQogICAgfSkKICAgIAogICAgIyByZXN0b3JlIG5hbWVzCiAgICBuYW1lcyhmbS5scykgPC0gbmFtZXMoY3d0LjE5LjAxLmZyY1tbaV1dKQogICAgCiAgICAjIHJldHVybiB3dGQgZm0gbGlzdAogICAgcmV0dXJuKGZtLmxzKQp9KQpuYW1lcyhmbS53dGQuMTkuMDEpIDwtIG5hbWVzKGN3dC4xOS4wMS5mcmMpCmBgYAoKYGBge3IgcHJlcC1jd3QtMTRjLXBsb3R9CiMgbWFrZSBkZiBmb3Igc3BsaW5lZCAnMDEgZGF0YQpkZW5zLjAxLmRmIDwtIGJpbmRfcm93cygKICBsYXBwbHkoZm0ud3RkLjE5LjAxLCBmdW5jdGlvbihscykgYmluZF9yb3dzKGxzLCAuaWQgPSAiUE1lY28iKSksIC5pZCA9ICJmcmMiKSAlPiUKICBtdXRhdGUocG0gPSBpZmVsc2Uoc3Vic3RyKFBNZWNvLCAxLCAyKSA9PSAiQU4iLCAiYW5kZXNpdGUiLCAKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN1YnN0cihQTWVjbywgMSwgMikgPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpLCAKICAgICAgICAgZWNvID0gZmFjdG9yKAogICAgICAgICAgIGlmZWxzZShzdWJzdHIoUE1lY28sIDMsIDQpID09ICJwcCIsICJ3YXJtIiwgCiAgICAgICAgICAgICAgICAgIGlmZWxzZShzdWJzdHIoUE1lY28sIDMsIDQpID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgIHllYXIgPSAyMDAxLAogICAgICAgICBZZWFyID0gYXMuY2hhcmFjdGVyKHllYXIpLAogICAgICAgICBmcmNfMTRjID0gY29udmVydF9mbV9kMTRjKGZtID0gZm0sIG9ic19kYXRlX3kgPSB5ZWFyLCB2ZXJib3NlID0gRkFMU0UpLAogICAgICAgICBmcmMgPSBmYWN0b3IoZnJjLCAKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkZQT00iLCAiT1BPTSIsICJNT00iKSwgCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJmUE9NIiwgIm9QT00iLCAibWluQyIpKSkgJT4lCiAgcmVuYW1lKEYxNEMgPSBmbSkKCiMgY29tYmluZSAnMDEsICcxOSBkYXRhOyBybSBOQQpkZW5zLjAxLjE5LmRmIDwtIHJiaW5kKAogIGRlbnMuMDEuZGYsCiAgZGVucy4wMS4wOS4xOS5kZltkZW5zLjAxLjA5LjE5LmRmJHllYXIgPT0gMjAxOSwgCiAgICAgICAgICAgICAgICAgICBuYW1lcyhkZW5zLjAxLjA5LjE5LmRmKSAlaW4lIG5hbWVzKGRlbnMuMDEuZGYpXSkgJT4lCiAgZmlsdGVyKCFpcy5uYShmcmNfMTRjKSkKCiMgYWRkIFBNZWNvX2RlcHRoIGNvbApkZW5zLjAxLjE5LmRmJFBNZWNvX2RlcHRoIDwtIHBhc3RlMChkZW5zLjAxLjE5LmRmJFBNZWNvLCAiXyIsIGRlbnMuMDEuMTkuZGYkbHlyX2JvdCAtIDEwLCAiLSIsIGRlbnMuMDEuMTkuZGYkbHlyX2JvdCkKCiMgc2F2ZQpzYXZlKGRlbnMuMDEuMTkuZGYsIGZpbGUgPSAiZGVucy4wMS4xOS5kZi5SRGF0YSIpCgojIHBsb3QgZmMKcGxvdC5kMTRjLnRzLmZ4IDwtIGZ1bmN0aW9uKGRmLCBjb21wYXJlX3ZhcikgewogIAogICMgc2V0IHF1b192YXIKICBxdW9fdmFyIDwtIHN5bShjb21wYXJlX3ZhcikKICAKICAjIHNldCBmYWNldCB2YXIgYW5kIGNvbG9yIHNjYWxlcwogIGlmIChjb21wYXJlX3ZhciA9PSAicG0iKSB7CiAgICBmX3ZhciA8LSBzeW0oImVjbyIpCiAgICBjdmFscyA8LSBjKCJhbmRlc2l0ZSIgPSBhbmRlc2l0ZSwgImJhc2FsdCIgPSBiYXNhbHQsICJncmFuaXRlIiA9IGdyYW5pdGUpIAogIH0gZWxzZSB7CiAgICBmX3ZhciA8LSBzeW0oInBtIikKICAgIGN2YWxzIDwtIGMoIndhcm0iID0gd2FybSwgImNvb2wiID0gY29vbCwgImNvbGQiID0gY29sZCkKICB9CiAgCiAgIyBzcGxpdCBieSBkZXB0aCBhbmQgcGxvdAogIGxhcHBseShzcGxpdChkZiwgZGYkbHlyX2JvdCksIGZ1bmN0aW9uKHgpIHsKICAgIGdncGxvdCh4LCBhZXMoeWVhciwgZnJjXzE0YywgY29sb3IgPSAhISBxdW9fdmFyKSkgKwogICAgZ2VvbV9saW5lKGRhdGEgPSBhdG0uMTRjLCBhZXMoeWVhciwgZDE0YyksIGxpbmV0eXBlID0gMywgY29sb3IgPSAiZ3JheSIpICsKICAgIGdlb21fbGluZSgpICsKICAgIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gZWNvKSwgc2l6ZSA9IDIpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gTlVMTCwgdmFsdWVzID0gY3ZhbHMpICsKICAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIiA9IDE1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCIgPSAxNikpICsKICAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKDIwMDEsIDIwMTkpKSArCiAgICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGZyYyksIGNvbHMgPSB2YXJzKCEhIGZfdmFyKSkgKwogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQogIH0pCn0KYGBgCgojIyMgMTRDIHRpbWUgc2VyaWVzCgpgYGB7ciBwbG90LWN3dC0xNGN9CiMgcGxvdApwbG90LmQxNGMudHMuZngoZGVucy4wMS4xOS5kZiwgInBtIikKcGxvdC5kMTRjLnRzLmZ4KGRlbnMuMDEuMTkuZGYsICJlY28iKQpgYGAKCiMjIyBDaGFyIHBvb2wgY2FsYwoKYGBge3IgcG9tLW1pbkMtMTRjfQojIEtvYXJhc2hpIGNoYXIgZXF1YXRpb24KY2hhci5meCA8LSBmdW5jdGlvbihwb21fMTRjKSB7CiAgKHBvbV8xNGMgLSAxNDkuOSkgLyAtNy4yNzggCn0KCiMgbWFrZSBkZiBvZiBwb20gKyBtaW5DLCBjYWxjdWxhdGUgY2hhciBDIHVzaW5nIEtvYXJhc2hpIGRhdGEKcG9tLmMuMTRjLjAxLmRmIDwtIG1lcmdlKAogIHBvbS5jLjAxLmRmLAogIGRlbnMuMDEuMTkuZGYgJT4lCiAgICBmaWx0ZXIoeWVhciA9PSAyMDAxKSwKICBieSA9IGMoIlBNZWNvIiwgImZyYyIsICJseXJfYm90IikpICU+JQogIG11dGF0ZSh3dGRfMTRjID0gY19QT01fZnJjICogZnJjXzE0YykgJT4lCiAgZ3JvdXBfYnkoUE1lY28sIHBtLCBlY28sIGx5cl9ib3QsIHNvY19QT00sIHllYXIpICU+JQogIHN1bW1hcml6ZShwb21fMTRjID0gc3VtKHd0ZF8xNGMpKQpwb20uYy4xNGMuMDEuZGYgPC0gcG9tLmMuMTRjLjAxLmRmICU+JQogIG11dGF0ZShjX3BjdF9jaGFyID0gY2hhci5meChwb21fMTRjKSwKICAgICAgICAgc29jX2NoYXIgPSBjX3BjdF9jaGFyICogc29jX1BPTSAqIDEwXi0yLAogICAgICAgICBzb2Nfbm9uQ2hhciA9IHNvY19QT00gLSBzb2NfY2hhciwKICAgICAgICAgZDE0Y19jaGFyID0gLTU3Ny45LAogICAgICAgICBkMTRjX25vbkNoYXIgPSAocG9tXzE0YyAtIGQxNGNfY2hhciAqIGNfcGN0X2NoYXIpIC8gKDEwMCAtIGNfcGN0X2NoYXIpKQpnZ3Bsb3QocG9tLmMuMTRjLjAxLmRmLCBhZXMoZWNvLCBkMTRjX25vbkNoYXIsIGZpbGwgPSBwbSkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSBhbmRlc2l0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gYmFzYWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gZ3Jhbml0ZSkpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGx5cl9ib3QpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgIyBjYWxjLiBjaGFyIGZvciBvUE9NIG9ubHkKIyBvcG9tLmMuMTRjLjAxLmRmIDwtIG1lcmdlKAojICAgYmluZF9yb3dzKHNvYy4yMDAxLmZyY1NPQy5zcC5kZiRPUE9NLCAuaWQgPSAiUE1lY28iKSAlPiUKIyAgICAgbXV0YXRlKGZyYyA9ICJvUE9NIiksCiMgICBkZW5zLjAxLjE5LmRmICU+JQojICAgICBmaWx0ZXIoeWVhciA9PSAyMDAxKSwKIyAgIGJ5ID0gYygiUE1lY28iLCAiZnJjIiwgImx5cl9ib3QiKSkgJT4lCiMgICBtdXRhdGUoY19wY3RfY2hhciA9IGNoYXIuZngoZnJjXzE0YyksCiMgICAgICAgICAgc29jX2NoYXIgPSBjX3BjdF9jaGFyICogbHlyX3NvYyAqIDEwXi0yLAojICAgICAgICAgIHNvY19ub25DaGFyID0gbHlyX3NvYyAtIHNvY19jaGFyLAojICAgICAgICAgIGQxNGNfY2hhciA9IC01NzcuOSwKIyAgICAgICAgICBkMTRjX25vbkNoYXIgPSAoZnJjXzE0YyAtIGQxNGNfY2hhciAqIGNfcGN0X2NoYXIpIC8gKDEwMCAtIGNfcGN0X2NoYXIpKQojIGdncGxvdChvcG9tLmMuMTRjLjAxLmRmLCBhZXMoZWNvLCBjX3BjdF9jaGFyLCBmaWxsID0gcG0pKSArCiMgICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKIyAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9IGJhc2FsdCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gZ3Jhbml0ZSkpICsKIyAgIGZhY2V0X2dyaWQocm93cyA9IHZhcnMobHlyX2JvdCkpICsKIyAgIHRoZW1lX2J3KCkgKwojICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgojIyMgRnJlZSBsaWdodCB2cyByZXNwaXJlZCAxNEMKCmBgYHtyIHBsb3QtTEYtaW5jfQojIGxvYWQgZGF0YQpsb2FkKCIvVXNlcnMvamVmZi9zcmEtdHMvc291cmNlL3NyYS5hbGwubWluLlJEYXRhIikKbG9hZCgiL1VzZXJzL2plZmYvc3JhLXRzL3NvdXJjZS9zcmEuaW5jLmFsbC5SRGF0YSIpICMgcmF3CmxvYWQoIi9Vc2Vycy9qZWZmL3NyYS10cy9zb3VyY2Uvc3JhLjE5LjAxLmluYy5SRGF0YSIpICMgc3BsaW5lZAoKIyBjb252ZXJ0IGRlbnMuZGYgdG8gd2lkZQpkZW5zLjAxLjE5LmRmLncgPC0gZGVucy4wMS4wOS4xOS5kZiAlPiUKICBzZWxlY3QoUE1lY28sIFllYXIsIGZyYywgbHlyX2JvdCwgZnJjXzE0YykgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGZyYywgdmFsdWVzX2Zyb20gPSBmcmNfMTRjKQpkZW5zLmluYy5taW4udyA8LSBtZXJnZSgKICBzcmEuaW5jLmFsbCwKICBkZW5zLjAxLjE5LmRmLncgJT4lCiAgICBtdXRhdGUocG0gPSBpZmVsc2UoZ3JlcGwoIkFOIiwgUE1lY28pLCAiYW5kZXNpdGUiLCAKICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIkJTIiwgUE1lY28pLCAiYmFzYWx0IiwgImdyYW5pdGUiKSksCiAgICAgICAgICAgZWNvID0gaWZlbHNlKGdyZXBsKCJwcCIsIFBNZWNvKSwgIndhcm0iLCAKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJ3ZiIsIFBNZWNvKSwgImNvb2wiLCAiY29sZCIpKSkpCgojIGFkZCBkZXB0aCBpbmRleCBjb2wKZGVucy5pbmMubWluLncgPC0gYmluZF9yb3dzKAogIGxhcHBseShzcGxpdChkZW5zLmluYy5taW4udywgZGVucy5pbmMubWluLnckWWVhciksIGZ1bmN0aW9uKHgpIHsKICAgIGJpbmRfcm93cyhsYXBwbHkoc3BsaXQoeCwgeCRQTWVjbyksIGZ1bmN0aW9uKHkpIHsKICAgICAgaWYgKGlzLm51bGwoeSRkZXB0aCkpIHsKICAgICAgIHlbb3JkZXIoeSRseXJfYm90KSwgXSAlPiUKICAgICAgICBtdXRhdGUoZGVwdGggPSBzZXEoMSwgbnJvdyh5KSkpIAogICAgICB9CiAgICB9KSkKICB9KSkKCgojIHBsb3QgaW5jIHYgTEYKIyBwbG90IHByb2ZpbGVzIGJ5IHllYXIgYW5kIGZyYWN0aW9uIHR5cGUKZGVucy5pbmMubWluLncgJT4lCiAgZmlsdGVyKGQxNGNfbWVhbiA+IC03MCkgJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjX21lYW4sIGZQT00sIGNvbG9yID0gcG0sIHNoYXBlID0gZWNvKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGNvbG9yID0gImxpZ2h0Z3JheSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJsaWdodGdyYXkiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWF4ID0gZDE0Y191LCB4bWluID0gZDE0Y19sKSwgaGVpZ2h0ID0gMSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gYmFzYWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9IGdyYW5pdGUpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiQ2xpbWF0ZSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0iID0gMTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQiID0gMTYpKSArCiAgIyBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoLTEyMCwgMTEwKSwgeWxpbSA9IGMoLTEyMCwgMTEwKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoZGVwdGgpLCByb3dzID0gdmFycyhZZWFyKSkgKyAKICB4bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MtQ08nWzJdKicgKOKAsCknKSkgKwogIHlsYWIoZXhwcmVzc2lvbignZnJlZSBsaWdodCAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGFzcGVjdC5yYXRpbyA9IDEpCgojIHBsb3QgcmVzcGlyZWQgYWdhaW5zdCBub25DaGFyOyBzcGxpbmVkIGRhdGE7ICcwMSBvbmx5CmRlbnMuaW5jLm5vbkNoYXIuZGYgPC0gbWVyZ2UoCiAgcG9tLmMuMTRjLjAxLmRmWyAsIGMoIlBNZWNvIiwgInBtIiwgImVjbyIsICJseXJfYm90IiwgInllYXIiLCAiZDE0Y19ub25DaGFyIildLAogIHNyYS4xOS4wMS5pbmNbICwgd2hpY2goIShuYW1lcyhzcmEuMTkuMDEuaW5jKSAlaW4lIGMoIlBNIiwgIkVDTyIpKSldKQogIApkZW5zLmluYy5ub25DaGFyLmRmICU+JQogIGZpbHRlcihkMTRjID4gLTcwKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxNGMsIGQxNGNfbm9uQ2hhciwgY29sb3IgPSBwbSkpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJsaWdodGdyYXkiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAibGlnaHRncmF5IikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gZWNvKSwgc2l6ZSA9IDMpICsKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGQxNGNfbWluLCB4bWF4ID0gZDE0Y19tYXgpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSBiYXNhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gZ3Jhbml0ZSkpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJDbGltYXRlIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSIgPSAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCIgPSAxNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCIgPSAxNikpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGx5cl9ib3QpKSArIAogIHhsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQy1DTydbMl0qJyAo4oCwKScpKSArCiAgeWxhYihleHByZXNzaW9uKCdub24tY2hhciAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGFzcGVjdC5yYXRpbyA9IDEpCmBgYAoKIyMgVGhlcm1hbCBmcmFjdGlvbnMKIyMjIEMgcmVsZWFzZSAodGhlcm1vZ3JhbXMpCmBgYHtyIHRoZXJtYWwtZGF0YX0KIyBsb2FkIHRoZXJtb2dyYW0gZGF0YSBhbmQgY29tYmluZQpBTndmLjMwLkhGX3RtbCA8LSByZWFkLmNzdigiLi4vZGF0YS9leHRlcm5hbC9zcmFfdGhtbF8xNENfc3RvbmVyL3Ntb290aF9BTndmIE1PTV9SUE8uY3N2IikKQlN3Zi4zMC5IRl90bWwgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZXh0ZXJuYWwvc3JhX3RobWxfMTRDX3N0b25lci9zbW9vdGhfQlN3ZiAyMC0zMCBGcmFjIGZpeC5jc3YiKQpHUndmLjMwLkhGX3RtbCA8LSByZWFkLmNzdigiLi4vZGF0YS9leHRlcm5hbC9zcmFfdGhtbF8xNENfc3RvbmVyL3Ntb290aF9HUndmIE1PTV9SUE8uY3N2IikKSEZfdG1sLmRmIDwtIGNiaW5kKHJiaW5kKEFOd2YuMzAuSEZfdG1sLCBCU3dmLjMwLkhGX3RtbCwgR1J3Zi4zMC5IRl90bWwpLCAKICAgICAgICAgICAgICAgICAgIHNpdGUgPSBjKHJlcCgiQU53ZiIsIG5yb3coQU53Zi4zMC5IRl90bWwpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAoIkJTd2YiLCBucm93KEJTd2YuMzAuSEZfdG1sKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwKCJHUndmIiwgbnJvdyhHUndmLjMwLkhGX3RtbCkpKSkKSEZfdG1sLmRmJFBNIDwtIHN1YnN0cihIRl90bWwuZGYkc2l0ZSwgMSwgMikKCiMgdGVtcCBjdXRzIGRmCkhGX3RtbC50ZW1wcy5kZiA8LSBkYXRhLmZyYW1lKAogIFBNID0gcmVwKGMoIkFOIiwgIkJTIiwgIkdSIiksIGVhID0gNSksCiAgY3V0ID0gcmVwKDE6NSwgMyksCiAgdGVtcCA9IGMoMTQwLCAyNDUsIDM0MCwgMzkwLCA0OTUsCiAgICAgICAgICAgMTQxLjUsIDI0Ni41LCAyOTAsIDM2NCwgNDg0LAogICAgICAgICAgIDE0MywgMjQ4LCAyOTMsIDM2NywgNDg3KQopCgojIHBsb3QKZ2dwbG90KEhGX3RtbC5kZiwgYWVzKHRlbXAsIE1vdmluZywgY29sb3IgPSBQTSkpICsKICAjIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSB0ZW1wLCBjb2xvciA9IFBNKSwKICAjICAgICAgICAgICAgZGF0YSA9IEhGX3RtbC50ZW1wcy5kZiwKICAjICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgYWxwaGEgPSAuNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fbGluZSgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiQU4iID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9IGJhc2FsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gZ3Jhbml0ZSkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCiMjIyBUaGVybWFsIGZyYWN0aW9uIDE0QwoKYGBge3IgdG1sLTE0Y30KIyB3cmFuZ2xlIDE0QyBkYXRhIHRvIGRmCmZyYy4xNGMuZGYgPC0gYmluZF9yb3dzKGFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWZyYzE5LU1PTS10aG1sXzIwMjItMDEtMjBgKSAlPiUgCiAgZHBseXI6OnNsaWNlKDE6MTUpICU+JQogIG11dGF0ZShQTSA9IHN1YnN0cihQcm9iZSwgMSwgMiksCiAgICAgICAgIEVDTyA9ICJ3ZiIsIAogICAgICAgICB0aG1sX2ZyYyA9IGFzLm51bWVyaWMoc3Vic3RyKFByb2JlLCBuY2hhcihQcm9iZSksIG5jaGFyKFByb2JlKSkpKSAlPiUKICAjIGZpeCBTaGFuZSdzIG1pc2xhYmVsaW5nIG9mIDE0QyBkYXRhCiAgbXV0YXRlKFBNID0gaWZlbHNlKFBNID09ICJBTiIsICJHUiIsIGlmZWxzZShQTSA9PSAiR1IiLCAiQU4iLCBQTSkpKSAlPiUKICByZW5hbWUoZm0gPSBGMTRDLCBmbV9lcnIgPSBlcnIsIGQxNGMgPSBg4oiGMTRDLijigLApYCwgZDE0Y19lcnIgPSBgZXJyLijigLApYCkgJT4lCiAgc2VsZWN0KFBNLCBFQ08sIHRobWxfZnJjLCBkMTRjLCBkMTRjX2VyciwgZm0sIGZtX2VycikKCiMgcGxvdApnZ3Bsb3QoZnJjLjE0Yy5kZiwgYWVzKHRobWxfZnJjLCBkMTRjLCBmaWxsID0gUE0pKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiQU4iID0gYW5kZXNpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gYmFzYWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9IGdyYW5pdGUpKSArIAogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoUE0pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgc3RlcCBwbG90CmZyYy4xNGMuZGYgJT4lCiAgZmlsdGVyKHRobWxfZnJjID09IDUpICU+JQogIG11dGF0ZSh0aG1sX2ZyYyA9IDYpICU+JQogIHJiaW5kKGZyYy4xNGMuZGYsIC4pICU+JQogIGdncGxvdCguLCBhZXModGhtbF9mcmMsIGQxNGMsIGNvbG9yID0gUE0pKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIGdlb21fc3RlcCgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIkFOIiA9IGFuZGVzaXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSBiYXNhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9IGdyYW5pdGUpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBTiIgPSAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAiYmFzYWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImdyYW5pdGUiKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMS41LCA1LjUpLCBsYWJlbHMgPSBhcy5jaGFyYWN0ZXIoc2VxKDEsIDUpKSkgKwogIHlsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgeGxhYigiVGhlcm1hbCBmcmFjdGlvbiIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQpgYGA=